产品开发时,使用硬件SPI没有问题,因为有很多的库可以选择
但是有时候很无奈的是,你的硬件资源SPI用完了,
或者基于某种原因你不得不使用软件模拟SPI
对于软件模拟SPI的问题,不是很明白
以下是问题的详细的描述:
先说一下SPI的WRITE时序:如图:
其时序描述如下:
[mw_shl_code=c,true]void Write_REG(unsigned char ADD,unsigned long int WR_DAT)
{
unsigned int m=0,j=0;
unsigned long int temp1=0x800000;
unsigned char temp2=0x20;
// SEN=0;
_nop_();
_nop_();
SEN=1;
SDI=0;
CLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
CLK=1;
for(m=0;m<6;m++)
{
CLK=1;
_nop_();
_nop_();
if(( ADD&temp2)==0x0)
SDI=0;
else
SDI=1;
_nop_();
CLK=0;
_nop_();
temp2=temp2>>1;
}
for(j=0;j<24;j++)
{
CLK=1;
_nop_();
if((WR_DAT&temp1)==0X0)
SDI=0;
else
SDI=1;
_nop_();
CLK=0 ;
_nop_();
temp1=temp1>>1;
}
CLK=1;
Delay_us(2);
CLK=0;
Delay_us(2);
CLK=1;
Delay_us(2);
CLK=0;
Delay_us(2);
SEN=0;
Delay_us(10);
}[/mw_shl_code]
再说一下SPI的READ时序,如图:
其时序描述如下:
[mw_shl_code=c,true]unsigned long int Read_REG(unsigned char ADD)
{
unsigned int m=0,j=0;
unsigned long int RD_DAT=0;
unsigned char temp2=0x20,DAT=0;
// SEN=0;
_nop_();
_nop_();
SEN=1;
SDI=1;
CLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
CLK=1;
for(m=0;m<6;m++)
{
CLK=1;
_nop_();
_nop_();
if(( ADD&temp2)==0x0)
SDI=0;
else
SDI=1;
_nop_();
CLK=0;
_nop_();
temp2=temp2>>1;
}
CLK=1; //第七个上升沿和下降沿
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
for(j=0;j<24;j++)
{
CLK=1;
_nop_();
if(SD_LD0==0)
DAT=0;
else
DAT=1;
_nop_();
CLK=0 ;
_nop_();
if(j<23)
{
RD_DAT=(RD_DAT|DAT )<<1;
}
else;
}
CLK=1;
Delay_us(1);
SEN=0;
Delay_us(1);
CLK=0;
Delay_us(10);
return(RD_DAT) ;
}
[/mw_shl_code]
然后就是本人对此有点疑问:
1.我想知道以上的时序图对应的描述是否OK?
2.在模拟SPI的时序或者其他的时序时,所要注意的是什么?
3.如何确定你的时序模拟的是对的?使用示波器看模拟后发的波形吗?
4.如何完整的用代码把一个时序图给完整的表达出来?
非常感谢路过的朋友,如果原子看到,麻烦帮下忙,谢谢!!!!! |