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

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

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

唯样头条公众号
最新最热
行业资讯
领先元件
技术方案
订阅栏目
效率阅读
品牌专区
相关文章
最新入库
编号 分类 库存
TPS65287RHAR
TI
DC-DC转换器 0
VZT151M1VTR-0607
LELON
未分类 0
VZT101M1ETR-0605
LELON
未分类 0
LBZT52MB24T1G
LRC
通用二极管 0
AF0201FR-0769K8L
Yageo
未分类 0
AB08000001
TXC
未分类 0