新唐M051 spi使用程序

新唐M051 spi使用程序

#include "SPI.h"
#define DEBUGMSG printf
STATIC UINT32 g_unSpi0Rx0Data = 0, g_unSpi1Rx0Data = 0;
/****************************************
*函数名称:Spi0MasterInit
*输 入:无
*输 出:无
*功 能:SPI0初始化为主机模式
******************************************/
VOID Spi0MasterInit(VOID)
{
P1_MFP &= ~(P14_AIN4_SPI0SS | P15_AIN5_SPI0MOSI | P16_AIN6_SPI0MISO | P17_AIN7_SPI0CLK);
P1_MFP |= (SPI0SS | SPI0MOSI | SPI0MISO | SPI0CLK) ; //使能SPI0相关引脚
ENABLE_SPI0_CLK; //SPI0时钟使能
SPI0_SSR &= ~LVL_H; //从机选择选择信号通过低电平激活
SPI0_CNTRL &= ~LSB_FIRST; //优先发送/接收最高有效位
SPI0_CNTRL &= ~CLKP_IDLE_H; //SCLK空闲时为低电平
SPI0_CNTRL |= TX_NEG_F; //SDO 信号在SPICLK的下降沿改变
SPI0_CNTRL &= ~RX_NEG_F; //SDI 信号在SPICLK上升沿锁存
CLKDIV &= 0xFFFFFFF0; //HCLK_N = 0, Pclk = SYSclk/(HCLK_N+1)
SPI0_DIVIDER &= 0xFFFF0000; //SPIclk = Pclk/((HCLK_N+1)*2)
SPI0_DIVIDER |= 0x00000002;
SET_SPI0_MASTER_MODE; //SPI0工作在主机模式
ENABLE_SPI0_AUTO_SLAVE_SLECT; //使能自动从机选择
SPI0_SSR |= SSR_ACT;
}
/****************************************
*函数名称:Spi0Send1W
*输 入:ulData 发送的数据
ucLength 数据长度
*输 出:无
*功 能:SPI0发送数据
******************************************/
VOID Spi0Send1W(UINT32 ulData, UINT8 ucLength)
{
SPI0_CNTRL &= TX_NUM_ONE;
Spi0Length(ucLength);
SPI0_TX0 = ulData;
SPI0_CNTRL |= GO_BUSY;
}

/****************************************
*函数名称:GetSlaveID
*输 入:无
*输 出:无
*功 能:获取从机ID
******************************************/
VOID GetSlaveID(VOID)
{
Spi0Send1W(0x00000055, 0x08);
while((SPI0_CNTRL & GO_BUSY)!=0);

Spi0Send1W(0x00000000, 0x08);
while((SPI0_CNTRL & GO_BUSY)!=0);
g_unSpi0Rx0Data = SPI0_RX0;
}
/****************************************
*函数名称:Spi0Length
*输 入:ucLength 数据长度
*输 出:无
*功 能:设置SPI0数据长度
******************************************/
VOID Spi0Length(UINT8 ucLength)
{
if(ucLength <= 0x20)
{
if((ucLength & 0x01) == 0)
SPI0_CNTRL &= ~(1<<3);
else
SPI0_CNTRL |= (1<<3);
if((ucLength & 0x02) == 0)
SPI0_CNTRL &= ~(1<<4);
else
SPI0_CNTRL |= (1<<4);

if((ucLength & 0x04) == 0)
SPI0_CNTRL &= ~(1<<5);
else
SPI0_CNTRL |= (1<<5);

if((ucLength & 0x08) == 0)
SPI0_CNTRL &= ~(1<<6);
else
SPI0_CNTRL |= (1<<6);

if((ucLength & 0x10) == 0)
SPI0_CNTRL &= ~(1<<7);
else
SPI0_CNTRL |= (1<<7);
}
}
/****************************************
*函数名称:Spi1SlaveInit
*输 入:无
*输 出:无
*功 能:SPI1初始化为从机
******************************************/
VOID Spi1SlaveInit(VOID)
{
P0_MFP &= ~(P04_AD4_SPI1SS | P05_AD5_SPI1MOSI | P06_AD6_SPI1MISO | P07_AD7_SPI1CLK);

P0_MFP |= (SPI1SS |SPI1MOSI | SPI1MISO | SPI1CLK) ; //使能SPI1相关引脚
ENABLE_SPI1_CLK;
SPI1_SSR &= LTRIG_EDG; //从机输入边沿触发
SPI1_SSR &= ~LVL_H; //从机选择选择信号通过低电平激活

SPI1_CNTRL &= ~LSB_FIRST; //优先发送/接收最高有效位
SPI1_CNTRL &= ~CLKP_IDLE_H; //SCLK空闲时为低电平
SPI1_CNTRL |= TX_NEG_F; //SDO 信号在SPICLK的下降沿改变
SPI1_CNTRL &= ~RX_NEG_F; //SDI 信号在SPICLK上升沿锁存

CLKDIV &= 0xFFFFFFF0; //HCLK_N = 0, Pclk = SYSclk/(HCLK_N+1)
SPI1_DIVIDER &= 0xFFFF0000; //SPIclk = Pclk/((HCLK_N+1)*2)
SPI1_DIVIDER |= 0x00000002;
SET_SPI1_SLAVE_MODE; //SPI1工作在从机模式

ENABLE_SPI1_INTERRUPT; //使能SPI1中断
NVIC_ISER |= SPI1_INT;
Spi1Length(8); //设置SPI1数据长度
SPI1_GO_BUSY; //等待SPI1 RX0接收信号
}
/****************************************
*函数名称:Spi1Length
*输 入:ucLength 数据长度
*输 出:无
*功 能:设置SPI1数据长度
******************************************/
VOID Spi1Length(UINT8 ucLength)
{
if(ucLength <= 0x20)
{
if((ucLength & 0x01) == 0)
SPI1_CNTRL &= ~(1<<3);
else
SPI1_CNTRL |= (1<<3);
if((ucLength & 0x02) == 0)
SPI1_CNTRL &= ~(1<<4);
else
SPI1_CNTRL |= (1<<4);

if((ucLength & 0x04) == 0)
SPI1_CNTRL &= ~(1<<5);
else
SPI1_CNTRL |= (1<<5);

if((ucLength & 0x08) == 0)
SPI1_CNTRL &= ~(1<<6);
else
SPI1_CNTRL |= (1<<6);

if((ucLength & 0x10) == 0)
SPI1_CNTRL &= ~(1<<7);
else
SPI1_CNTRL |= (1<<7);
}
}
/****************************************
*函数名称:PrintGetData
*输 入:无
*输 出:无
*功 能:打印SPI0/1接收到的数据
******************************************/
VOID PrintGetData(VOID)
{
DEBUGMSG("Slave Get Command = %X\n", g_unSpi1Rx0Data);
DEBUGMSG("Master Get Feed Back Data = %X\n", g_unSpi0Rx0Data);
}
/*****************************************
*函数名称:SPI1_IRQHandler
*输 入:无
*输 出:无
*功 能:SPI1中断服务函数
******************************************/
VOID SPI1_IRQHandler(VOID)
{
SPI1_CNTRL |= SPI_IF; //清除中断标志
if(SPI1_RX0 == 0x55)
{
g_unSpi1Rx0Data = SPI1_RX0;
SPI1_TX0 = 0x000000DA;
}
else
SPI1_TX0 = 0x00000000;
SPI1_GO_BUSY; //等待SPI1 RX0接收信号
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
INT32 main(VOID)
{
PROTECT_REG //ISP下载时保护FLASH存储器
(
PWRCON |= XTL12M_EN;//默认时钟源为外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//设置外部晶振为系统时钟
)
UartInit(12000000,9600);//波特率设置为9600bps
Spi0MasterInit();//SPI0初始化为主机模式
Spi1SlaveInit();//SPI1初始化为从机模式
while(1)
{
DEBUGMSG("Master will send 0x55 data to slave and receive 0xDA data\r\n");
DEBUGMSG("Put AnyKey to Start Test\r\n");
GetSlaveID();
PrintGetData();
printf("\r\n\r\n");
Delayms(1000);
}
}


唯样商城-电子元器件采购网(www.bathurstca.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。唯样自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
本文由网络整理转载自单片机教程网,原文标题为:新唐M051 spi使用程序,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

上一篇:新唐M051 pwm使用程序

下一篇:新唐M051 BOD设置程序

唯样头条公众号
最新最热
行业资讯
领先元件
技术方案
订阅栏目
效率阅读
品牌专区
相关文章
最新入库
编号 分类 库存
ULCE0505A015FR
ICT
TVS二极管/ESD抑制器 70000
SPVN110107
ALPS Electric
检测开关 180000
SKSWCFE010
ALPS Electric
触觉开关 581300
SKSWADE010
ALPS Electric
触觉开关 200000
SCTA3A0103
ALPS Electric
PCB板夹具 24000
SCTA1A0100
ALPS Electric
PCB板夹具 30000
北京快三 江西快3 北京快三 江西快三 江西快3 北京快3 江西快三 江西快三 江西快三 江西快三