SPI的C语音通用实现Word文档下载推荐.docx
《SPI的C语音通用实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《SPI的C语音通用实现Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束
工作方式2:
当CPHA=0、CPOL=1时SPI总线工作在方式2。
与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。
工作方式3:
当CPHA=1、CPOL=0时SPI总线工作在方式3。
MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开
始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复
上述过程,直到一个字节的8位信号传输结束
工作方式4:
当CPHA=1、CPOL=1时SPI总线工作在方式4。
与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。
例如,WINBOND的W25XXX系列SPIFLASH就支持工作方式1和工作方式4
本文提供一种通用的IO模拟SPI的程序,用户只需几个简单的函数并初始化一个结构体TS_SPI_BSP,即可以调用StandardSpiMasterWrite和StandardSpiReadSlave对SPI芯片进行读写操作。
*/
typedefenum
{
scl_idle_low_sampling_at_first_edge=0,
scl_idle_high_sampling_at_first_edge,
scl_idle_low_sampling_at_second_edge,
scl_idle_high_sampling_at_second_edge,
}TE_SPI_MODE;
typedefstruct
/*片选脚拉高函数*/
void(*pfnCSsetHigh)(void);
/*片选脚拉低函数*/
void(*pfnCSsetLow)(void);
/*时钟脚拉高函数*/
void(*pfnSCKsetHigh)(void);
/*时钟脚拉低函数*/
void(*pfnSCKsetLow)(void);
/*主出从入脚拉高函数*/
void(*pfnMOSIsetHigh)(void);
/*主出从入脚拉低函数*/
void(*pfnMOSIsetLow)(void);
/*读主入从出脚电平函数*/
unsignedchar(*pfnReadMISO)(void);
/*短延时函数*/
void(*pfnSPIShortDelay)(void);
/*芯片的SPI模式*/
TE_SPI_MODEChipSpiMode;
}TS_SPI_BSP;
staticvoidmaster_write_mode1(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
unsignedchari;
for(i=0;
i<
8;
i++)
{
if(write_data&
0x80)
p_spi->
pfnMOSIsetHigh();
else
pfnMOSIsetLow();
p_spi->
pfnSCKsetHigh();
pfnSPIDelay();
write_data<
<
=1;
pfnSCKsetLow();
}
}
staticvoidmaster_write_mode2(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
staticvoidmaster_write_mode3(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
staticvoidmaster_write_mode4(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
staticunsignedcharread_slave_mode1(TS_SPI_BSP*p_spi)
unsignedcharReadData=0;
ReadData<
if(p_spi->
pfnReadMISO()==1)
ReadData|=0x01;
returnReadData;
staticunsignedcharread_slave_mode2(TS_SPI_BSP*p_spi)
staticunsignedcharread_slave_mode3(TS_SPI_BSP*p_spi)
staticunsignedcharread_slave_mode4(TS_SPI_BSP*p_spi)
staticvoidStandardSpiEnableChip(TS_SPI_BSP*p_spi)
p_spi->
pfnCSsetLow();
staticvoidStandardSpiDisableChip(TS_SPI_BSP*p_spi)
pfnCSsetHigh();
voidStandardSpiMasterWrite(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
StandardSpiEnableChip(p_spi);
switch(p_spi->
ChipSpiMode)
casescl_idle_low_sampling_at_first_edge:
master_write_mode1(p_spi,write_data);
break;
casescl_idle_high_sampling_at_first_edge:
master_write_mode2(p_spi,write_data);
casescl_idle_low_sampling_at_second_edge:
master_write_mode3(p_spi,write_data);
casescl_idle_high_sampling_at_second_edge:
master_write_mode4(p_spi,write_data);
default:
StandardSpiDisableChip(p_spi);
unsignedcharStandardSpiReadSlave(TS_SPI_BSP*p_spi)
unsignedcharretval=0;
retval=read_slave_mode1(p_spi);
retval=read_slave_mode2(p_spi);
retval=read_slave_mode3(p_spi);
retval=read_slave_mode4(p_spi);
returnretval;