📄 spi.c
字号:
#include "cfg.h"
void MSpiInit(uint8 Int_SPIx);
uint8 MSendData(uint8 Int_SPIx,uint8 data);
/****************************************************************************
* 名 称:void MSpiInit(uint8 Int_SPIx)
* 功 能:初始化SPI接口,设置为主机。SSEL0、SSEL1接上拉电阻,
同时用IO口指定从机的SSEL为低电位
* 入口参数:Int_SPIx,SPI0、SPI1,MSpiInit(0),MSpiInit(1)初始不分先后,
有效值0,1
* 出口参数:无
****************************************************************************/
void MSpiInit(uint8 Int_SPIx)
{ if (!Int_SPIx)
{ PINSEL0 = (PINSEL0 & ~0xff00) | 0x5500;//打开SCK0,MOSI0,MISO0,SSEL0
S0PDR = 0x00; //清SPI数据寄存器
S0PCCR = 0x52; //设置SPI时钟分频,SPI速率=Fplck/SxPCCR,
//SxPCCR必须为偶数,且不小于8
S0PCR = 0<<0 | //[2:0]无定义
0<<3 | //CPHA=0:上升沿采样,下降沿输出;1:下升沿采样,上降沿输出
1<<4 | //CPOL=0:SCK高电平有效;1:SCK低电平有效
1<<5 | //MSTR=0:从机;1:主机
0<<6 | //LSBF=0:SPI数据传输MSB在先;1:LSB在先
0<<7 ; //SPIE=0:中断禁止;1:中断使能
S0PINT= 0<<0 | //SPIE中断标志位,1:有中断;向该位写1清0,
//当SPIF和WCOL至少有一位为1时,SPIE置位
0<<1 ; //[7:1]无定义
/* S0PSR只读
S0PSR = 0<<0 | //[2:0]无定义
0<<3 | //ABRT=1:从机中止标志,1:中止;读取该位清0
0<<4 | //MODF=0:模式错误,1:错误;读取该位清0,当清0后,才能写SxPCR
0<<5 | //ROVR=0:读溢出;1:溢出;读取该位清0
0<<6 | //WCOL=0:写冲突,1:冲突;读取该位清0
0<<7 ; //SPIF=0:传输完成标志;1:有完成;读取该位清0
*/
}
if (Int_SPIx)
{ PINSEL1 = (PINSEL1 & ~0x3fc) | 0x2a8;//打开SCK1,MOSI1,MISO1,SSEL1
S1PDR = 0x00; //清SPI数据寄存器
S1PCCR = 0x52; //设置SPI时钟分频,SPI速率=Fplck/SxPCCR,
//SxPCCR必须为偶数,且不小于8
S1PCR = 0<<0 | //[2:0]无定义
0<<3 | //CPHA=0:上升沿采样,下降沿输出;1:下升沿采样,上降沿输出
1<<4 | //CPOL=0:SCK高电平有效;1:SCK低电平有效
1<<5 | //MSTR=0:从机;1:主机
0<<6 | //LSBF=0:SPI数据传输MSB在先;1:LSB在先
0<<7 ; //SPIE=0:中断禁止;1:中断使能
S1PINT= 0<<0 | //SPIE中断标志位,1:有中断;向该位写1清0,
//当SPIF和WCOL至少有一位为1时,SPIE置位
0<<1 ; //[7:1]无定义
/* S1PSR只读
S1PSR = 0<<0 | //[2:0]无定义
0<<3 | //ABRT=1:从机中止标志,1:中止;读取该位清0
0<<4 | //MODF=0:模式错误,1:错误;读取该位清0,当清0后,才能写SxPCR
0<<5 | //ROVR=0:读溢出;1:溢出;读取该位清0
0<<6 | //WCOL=0:写冲突,1:冲突;读取该位清0
0<<7 ; //SPIF=0:传输完成标志;1:有完成;读取该位清0
*/
}
}
/****************************************************************************
* 名 称:uint8 MSendData(uint8 Int_SPIx,uint8 data)
* 功 能:向SPI总线发送数据,并接收从机发回的数据。
* 入口参数:Int_SPIx,SPI0、SPI1;data,待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/
uint8 MSendData(uint8 Int_SPIx,uint8 data)
{ uint8 Int_SPISendData;
if (!Int_SPIx)
{ IO0CLR = HC595_CS0; // 片选
S0PDR = data;
while( 0==(S0PSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
Int_SPISendData=S0PDR;
IO0SET = HC595_CS0;
}
if (Int_SPIx)
{ IO0CLR = HC595_CS1;
S1PDR = data;
while( 0==(S1PSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
Int_SPISendData=S1PDR;
IO0SET = HC595_CS1;
}
return Int_SPISendData ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -