OpenEdv-开源电子网

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

关于STM32f071使用SPI发送数据长度的问题

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-4-9
在线时间
3 小时
发表于 2018-4-10 08:47:01 | 显示全部楼层 |阅读模式
1金钱
最近在使用STM32F071做SPI通信,遇到了一个问题。SPI配置了数据位数为8bit,但实际发送MOSI却发出了16bit,每个字节都是这样。使用示波器观察,低8bit为实际数据,高8bit为0(SPI->DR默认填充高8位为0?),不知道什么情况,请原子哥解答一下

初始化代码:
QQ截图20180409191023.png
发送代码:

QQ截图20180409191054.png



QQ截图20180409191500.png

示波器观测波形
scope_3.jpg

其中红线为CLK,黄线为MOSI,绿线可以忽略。这是发送了两个8bit的数据波形,实际出来了2个16bit的数据,很奇怪。
万能的原子哥,求解答,该怎么样才能实现8bit数据的发送?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-4-9
在线时间
3 小时
 楼主| 发表于 2018-4-10 08:47:22 | 显示全部楼层
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-4-10 09:49:24 | 显示全部楼层
有效数据是8bit,后面8bit无效,因为需要获取返回8bit数据,所以需要产生8bit时钟,此时MOSI也会输出8bit,但无需关心,置1即可。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-4-9
在线时间
3 小时
 楼主| 发表于 2018-4-10 10:23:51 | 显示全部楼层
Acuity 发表于 2018-4-10 09:49
有效数据是8bit,后面8bit无效,因为需要获取返回8bit数据,所以需要产生8bit时钟,此时MOSI也会输出8bit, ...

应该不是等待接收的问题。SPI设置的是全双工模式,发送与接收同步,从协议上看应该是发8bit,同时会收到8bit。所以高8位完全没必要发啊
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-4-4
在线时间
17 小时
发表于 2018-4-10 11:10:25 | 显示全部楼层
把SPI_ReadWriteByte函数最后一行return SPI_ReceiveData改为return 0看看是不是SPI_ReceiveData的问题
回复

使用道具 举报

18

主题

453

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2014
金钱
2014
注册时间
2016-12-27
在线时间
136 小时
发表于 2018-4-10 12:08:52 | 显示全部楼层
贴一下你的SPI_ReceiveData()函数的实现,看看里面只是一个简单地读取 DR,还是在读取DR之前,有个先写DR的操作
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-4-10 12:37:36 | 显示全部楼层
可以参考官方的范例和库函数写法
一分耕耘一分收获。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-4-9
在线时间
3 小时
 楼主| 发表于 2018-4-10 13:50:58 | 显示全部楼层
anylinkin 发表于 2018-4-10 12:08
贴一下你的SPI_ReceiveData()函数的实现,看看里面只是一个简单地读取 DR,还是在读取DR之前,有个先写DR的 ...

UINT16 SPI_ReceiveData(SPI_TypeDef* sp)
{
    UINT16 rcv=0;
    rcv = sp->DR;
    return rcv;
}

这是SPI接收的函数,没有写操作。return 0也试过,没有作用
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-4-9
在线时间
3 小时
 楼主| 发表于 2018-4-10 13:55:57 | 显示全部楼层
void SPI_SendData(SPI_TypeDef* sp,UINT8 data)
{
    uint32_t spixbase = 0x00;
   
    /* Check the parameters */
    assert_param(IS_SPI_ALL_PERIPH(SPI2));
   
    spixbase = (uint32_t)SPI2;
    spixbase += 0x0C;
   
    *(__IO uint8_t *) spixbase = data;

}
找到一个例程,修改senddata函数如上,就可以实现8bit发送了。高8位不会再出现。
我也试了一下强制吧SPI2->DR寄存器修改为8位,也能实现8bit发送了。即:

uint8_t(sp->DR) = data;

这个不知道对接收有没有影响。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-4-10 15:58:33 | 显示全部楼层
linghc119 发表于 2018-4-10 10:23
应该不是等待接收的问题。SPI设置的是全双工模式,发送与接收同步,从协议上看应该是发8bit,同时会收到8 ...

这个根据spi外设而定,比如spi接口的eeprom,就是先发送地址后读取数据。大部分spi外设的寄存器操作也是这种模式。个别spi外设是收发同时的。
参考:https://blog.csdn.net/qq_20553613/article/details/78998617
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 04:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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