补充一下,这点,也真是初学SPI者进行困惑或者搞不清楚的地方。
我看过不少软硬件的SPI基本驱动,很多都是把读和写弄成2个不同基本驱动,其实这样做也许能够正常工作,但正确的做法是:其实我们对SPI驱动,最底层的,我们只需要一个就是发送8位数据并回读8位数据,就像这样:
unsigned char SPI__RW_Byte(unsigned char Data)
{
unsigned char Out = 0;
unsigned char i;// = 0;
for(i = 8; i > 0; i--)
{
SPI_CLK = 0;
SPI_MOSI=Data>>7;
Data <<= 1;
NOP();
NOP();
NOP();
NOP();
NOP();
Out<<=1;
SPI_CLK = 1;
Out|=SPI_MISO;
}
SPI_CLK = 0;
return Out;
}
这样的底层驱动,就可以完全正确的用在SPI命令 SPI读 SPI写等各种扩展函数上面。
当我们需要SPI命令时候,我们只需要:
SPI__RW_Byte(Command);//就可以了
而需要SPI读,那么就变成下面这样:
void SPI_Flash_Read ( u32 ReadAddr , u8* pBuffer , u16 NumByteToRead )
{
u16 i;
SPI_CS = 0;/* Enable chip select */
SPI_RW_Byte(XX_ReadData);
SPI_RW_Byte(ReadAddr);
for(i=0;i<NumByteToRead;i++)
{
pBuffer =SPI_RW_Byte(Dummy); //发送虚拟数据,驱动CLK读一个字节
}
SPI_CS = 1;/* Disable chip select */
}
|