SPI的C语音通用实现.docx
- 文档编号:6638443
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:8
- 大小:15.65KB
SPI的C语音通用实现.docx
《SPI的C语音通用实现.docx》由会员分享,可在线阅读,更多相关《SPI的C语音通用实现.docx(8页珍藏版)》请在冰豆网上搜索。
SPI的C语音通用实现
/*
SPI的四种模式时序详解:
CPOL:
时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平
CPHA:
时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样
工作方式1:
当CPHA=0、CPOL=0时SPI总线工作在方式1。
MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的
第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),
下一位数据信号上线,再重复上述过程,直到一个字节的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
p_spi->pfnMOSIsetLow();
p_spi->pfnSCKsetHigh();
p_spi->pfnSPIDelay();
write_data<<=1;
p_spi->pfnSCKsetLow();
p_spi->pfnSPIDelay();
}
}
staticvoidmaster_write_mode2(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
{
unsignedchari;
for(i=0;i<8;i++)
{
if(write_data&0x80)
p_spi->pfnMOSIsetHigh();
else
p_spi->pfnMOSIsetLow();
p_spi->pfnSCKsetLow();
p_spi->pfnSPIDelay();
write_data<<=1;
p_spi->pfnSCKsetHigh();
p_spi->pfnSPIDelay();
}
}
staticvoidmaster_write_mode3(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
{
unsignedchari;
for(i=0;i<8;i++)
{
p_spi->pfnSCKsetHigh();
if(write_data&0x80)
p_spi->pfnMOSIsetHigh();
else
p_spi->pfnMOSIsetLow();
p_spi->pfnSPIDelay();
p_spi->pfnSCKsetLow();
p_spi->pfnSPIDelay();
write_data<<=1;
}
}
staticvoidmaster_write_mode4(TS_SPI_BSP*p_spi,unsignedcharwrite_data)
{
unsignedchari;
for(i=0;i<8;i++)
{
p_spi->pfnSCKsetLow();
if(write_data&0x80)
p_spi->pfnMOSIsetHigh();
else
p_spi->pfnMOSIsetLow();
p_spi->pfnSPIDelay();
p_spi->pfnSCKsetHigh();
p_spi->pfnSPIDelay();
write_data<<=1;
}
}
staticunsignedcharread_slave_mode1(TS_SPI_BSP*p_spi)
{
unsignedchari;
unsignedcharReadData=0;
for(i=0;i<8;i++)
{
ReadData<<=1;
p_spi->pfnSCKsetHigh();
p_spi->pfnSPIDelay();
if(p_spi->pfnReadMISO()==1)
ReadData|=0x01;
p_spi->pfnSCKsetLow();
p_spi->pfnSPIDelay();
}
returnReadData;
}
staticunsignedcharread_slave_mode2(TS_SPI_BSP*p_spi)
{
unsignedchari;
unsignedcharReadData=0;
for(i=0;i<8;i++)
{
ReadData<<=1;
p_spi->pfnSCKsetLow();
p_spi->pfnSPIDelay();
if(p_spi->pfnReadMISO()==1)
ReadData|=0x01;
p_spi->pfnSCKsetHigh();
p_spi->pfnSPIDelay();
}
returnReadData;
}
staticunsignedcharread_slave_mode3(TS_SPI_BSP*p_spi)
{
unsignedchari;
unsignedcharReadData=0;
for(i=0;i<8;i++)
{
ReadData<<=1;
p_spi->pfnSCKsetHigh();
p_spi->pfnSPIDelay();
p_spi->pfnSCKsetLow();
if(p_spi->pfnReadMISO()==1)
ReadData|=0x01;
p_spi->pfnSPIDelay();
}
returnReadData;
}
staticunsignedcharread_slave_mode4(TS_SPI_BSP*p_spi)
{
unsignedchari;
unsignedcharReadData=0;
for(i=0;i<8;i++)
{
ReadData<<=1;
p_spi->pfnSCKsetLow();
p_spi->pfnSPIDelay();
p_spi->pfnSCKsetHigh();
if(p_spi->pfnReadMISO()==1)
ReadData|=0x01;
p_spi->pfnSPIDelay();
}
returnReadData;
}
staticvoidStandardSpiEnableChip(TS_SPI_BSP*p_spi)
{
p_spi->pfnCSsetLow();
}
staticvoidStandardSpiDisableChip(TS_SPI_BSP*p_spi)
{
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);
break;
casescl_idle_low_sampling_at_second_edge:
master_write_mode3(p_spi,write_data);
break;
casescl_idle_high_sampling_at_second_edge:
master_write_mode4(p_spi,write_data);
break;
default:
break;
}
StandardSpiDisableChip(p_spi);
}
unsignedcharStandardSpiReadSlave(TS_SPI_BSP*p_spi)
{
unsignedcharretval=0;
StandardSpiEnableChip(p_spi);
switch(p_spi->ChipSpiMode)
{
casescl_idle_low_sampling_at_first_edge:
retval=read_slave_mode1(p_spi);
break;
casescl_idle_high_sampling_at_first_edge:
retval=read_slave_mode2(p_spi);
break;
casescl_idle_low_sampling_at_second_edge:
retval=read_slave_mode3(p_spi);
break;
casescl_idle_high_sampling_at_second_edge:
retval=read_slave_mode4(p_spi);
break;
default:
break;
}
StandardSpiDisableChip(p_spi);
returnretval;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPI 语音 通用 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)