OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2627|回复: 8

SPI问题汇总求解!!!

[复制链接]

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
发表于 2016-11-10 13:39:06 | 显示全部楼层 |阅读模式
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是全双工通信的.可以在写的时候读取. 当你只想读取的时候,写一个没有用的值就行了.只想写的时候,读取回来的值不要了就行了.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-10 13:39:07 | 显示全部楼层
这个好简单,我来告诉你.SPI是全双工通信的.可以在写的时候读取. 当你只想读取的时候,写一个没有用的值就行了.只想写的时候,读取回来的值不要了就行了.
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-10 13:46:05 | 显示全部楼层

编辑一下语言,有些地方看不懂。

回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-10 16:29:33 | 显示全部楼层
顶一下
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-10 16:30:49 | 显示全部楼层
xuande 发表于 2016-11-10 13:46
编辑一下语言,有些地方看不懂。

额,问题感觉都说清楚了,就是有点长
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-10 17:20:40 | 显示全部楼层
操作系统 发表于 2016-11-10 17:00
这个好简单,我来告诉你.SPI是全双工通信的.可以在写的时候读取. 当你只想读取的时候,写一个没有用的值就行 ...

哦哦,我大概明白了,这个SPI2_ReadWriteByte(u8 TxData)函数主要是用来作主机传输还是接收数据用的,这里写的数据就是传输到从机的数据,接收的数据根本不需要在这边写。,大神,麻烦再看看我别的问题
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-10 17:31:24 | 显示全部楼层
操作系统 发表于 2016-11-10 17:00
这个好简单,我来告诉你.SPI是全双工通信的.可以在写的时候读取. 当你只想读取的时候,写一个没有用的值就行 ...

如果我要传输16位数据,是否要对函数进行修改
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2016-7-26
在线时间
33 小时
发表于 2016-11-10 17:38:53 | 显示全部楼层
很简单,只是把两个程序写到一块了,你也可以单独分开写,基础时序都是一样的 一个接一个发。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-10 20:33:34 | 显示全部楼层
beibei 发表于 2016-11-10 17:31
如果我要传输16位数据,是否要对函数进行修改

修改 不修改 都行得通。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 02:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表