初级会员

- 积分
- 62
- 金钱
- 62
- 注册时间
- 2016-9-26
- 在线时间
- 26 小时
|
10金钱
由于之前太蠢,以为SPI传输的CS软件控制为会自动识别的,后来才反应过来原来这个CS位是要在软件里面设置的,但是现在有几个问题想请教诸位大神:
(1)为什么用SPI进行数据传输的时候不直接使用SPI2_ReadWriteByte(),而不是直接使用SPI_I2S_SendData()来进行传输????
(2)SPI2_ReadWriteByte(u8 TxData)是如何判断数据是传输还是接受的,比如我直接写SPI2_ReadWriteByte(0XFF),如何判断它是发送还是接受,亦或者是这是在哪里进行设置的???
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}
(3)由于库函数范例程序中,由于W25Q64是八位数据传输,是u8 SPI2_ReadWriteByte(u8 TxData),
那么若是十六位数据传输,是不是就是unsigned int SPI2_ReadWrite(unsigned int TxData) (附:我在库里面没有找到u8的定义,但是是可以用的??)
其次,SPI初始化中用 SPI2_ReadWriteByte(0xff);//启动传输 那么如果我要传输16位数据,是不是要进行初始化SPI2_ReadWriteByte(0xffff);//启动传输
(4)我现在用SPI只是单纯给从机发送数据,我写了一段传输函数,但是实际测试仿真时不是那么对,想请问该如何修改??????
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
unsigned int SPI2_ReadWrite(unsigned int TxData)
{
unsigned int retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}
/***************************************************************/
//SPI发送
//reg: addr
//value:数据
/***************************************************************/
void SPI_CPLD(unsigned int value)
{
CPLD_CS=0; //CPLD选中
SPI2_ReadWrite(value);//发送数据
CPLD_CS=1; //CPLD不选中
}
|
最佳答案
查看完整内容[请看2#楼]
这个好简单,我来告诉你.SPI是全双工通信的.可以在写的时候读取. 当你只想读取的时候,写一个没有用的值就行了.只想写的时候,读取回来的值不要了就行了.
|