OpenEdv-开源电子网

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

STM32 SPI 8位模式下怎么读取出16位的SPI数据

[复制链接]

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
发表于 2017-1-10 16:44:32 | 显示全部楼层 |阅读模式
50金钱
最近在弄ILI9341触摸屏,发现他的SPI是读取16位数据,而我W25Q80和LCD屏要共用一个SPI,W25Q80是8位的SPI数据,这可就蛋疼死我了,原先我是想将SPI初始化成8位模式,然后读取16位数据时,连续读取2次,但是我怎么读,都不正确,搞不懂这8位模式下,是要怎么连续读取2次的,好头疼!!不知道原子哥咋解决啊!!很急!!我用的硬件SPI

最佳答案

查看完整内容[请看2#楼]

我放弃了~~,我还是修改下电路吧!!坑啊!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-10 16:44:33 | 显示全部楼层
lvkanger 发表于 2017-1-12 11:27
那你就分析下这些数据是不是对的,你这不是ADC的值嘛,也比较好分析

我放弃了~~,我还是修改下电路吧!!坑啊!!
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2017-1-10 17:01:39 | 显示全部楼层
试试...
66.png
回复

使用道具 举报

28

主题

288

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1213
金钱
1213
注册时间
2011-4-9
在线时间
97 小时
发表于 2017-1-10 17:10:25 | 显示全部楼层
读两次,再拼接
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-10 17:19:02 | 显示全部楼层

不行啊,虽然有读出数据,但是数据变化感觉就是不说很灵敏那种,和原子哥的那个模拟SPI出来的数据差别很明显
QQ截图20170110171706.jpg



回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-10 17:22:07 | 显示全部楼层

这是我的SpiReadWriteByte函数 QQ截图20170110172133.jpg

回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-10 17:48:52 | 显示全部楼层
SPI你想要收16位的数据,那么就要发三个字节出去,地址位后发FF就行,发一个字节你就收一个字节,最后把收到的数据再做处理
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-10 18:16:13 | 显示全部楼层
lvkanger 发表于 2017-1-10 17:48
SPI你想要收16位的数据,那么就要发三个字节出去,地址位后发FF就行,发一个字节你就收一个字节,最后把收 ...

这要咋发?原子哥的命令都是u8的 QQ截图20170110181501.jpg
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-10 18:22:02 | 显示全部楼层
GS1101923161 发表于 2017-1-10 18:16
这要咋发?原子哥的命令都是u8的

跟我说的一样啊,就是先发地址,然后收一个字节,但是这个字节没用,不用管,再发FF,收一个字节,是高8位,然后再发FF,收一个字节,是底8位。
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-10 18:23:15 | 显示全部楼层
发FF这个字节是为了让主机产生CLK,这样从机才能发送数据!
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-11 12:05:15 | 显示全部楼层
lvkanger 发表于 2017-1-10 18:22
跟我说的一样啊,就是先发地址,然后收一个字节,但是这个字节没用,不用管,再发FF,收一个字节,是高8 ...

我像你说的,将收到的第一个值扔掉,然后再收2个数据,结果发现数据为0的概率好大,而且数据跳动很大,很不正常!!
QQ截图20170111120220.png

回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-11 12:35:06 | 显示全部楼层
GS1101923161 发表于 2017-1-11 12:05
我像你说的,将收到的第一个值扔掉,然后再收2个数据,结果发现数据为0的概率好大,而且数据跳动很大,很 ...

多发了一个FF吧?
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-11 14:52:42 | 显示全部楼层
lvkanger 发表于 2017-1-11 12:35
多发了一个FF吧?

这2种我都试过了,不然那要咋弄
QQ截图20170111120220.png
181558oxvzyz090vvh0r0z.jpg



回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-11 16:19:08 | 显示全部楼层
GS1101923161 发表于 2017-1-11 14:52
这2种我都试过了,不然那要咋弄

建议你最好先把数据一个一个读出来,保存并打印出来,先不要做移位的操作,只看SPI得到的3个数据是什么!另外,你现在收到的数据都是什么呢?
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-11 19:19:34 | 显示全部楼层
lvkanger 发表于 2017-1-11 16:19
建议你最好先把数据一个一个读出来,保存并打印出来,先不要做移位的操作,只看SPI得到的3个数据是什么! ...

数据对比是这样的
QQ截图20170111191902.png
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-12 08:51:07 | 显示全部楼层
int i;
u8 rcv_buf[3] = {0};
u8 send_buf[3]={CMD,0xFF,0xFF};
for(i = 0;i < 3;i++)
{
    rcv_buf[i] = SpiReadWriteByte(send_buf[i]);
}
printf("%02X %02X %02X ",rcv_buf[0],rcv_buf[1],rcv_buf[2]);
你这样试试
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-12 10:19:00 | 显示全部楼层
lvkanger 发表于 2017-1-12 08:51
int i;
u8 rcv_buf[3] = {0};
u8 send_buf[3]={CMD,0xFF,0xFF};

因为CMD是个变量不能用于初始化,所以我稍微改了下,但结果还是一样
QQ截图20170112101647.jpg
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-12 10:57:03 | 显示全部楼层
GS1101923161 发表于 2017-1-12 10:19
因为CMD是个变量不能用于初始化,所以我稍微改了下,但结果还是一样

第一个数据是0是对的,因为那个字节没有用,后边两个字节就是你要用的16位数据
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-12 10:58:28 | 显示全部楼层
lvkanger 发表于 2017-1-12 10:57
第一个数据是0是对的,因为那个字节没有用,后边两个字节就是你要用的16位数据

最好在全部读出数据后再打印,因为打印有可能会影响SPI时序!
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-12 11:14:16 | 显示全部楼层
lvkanger 发表于 2017-1-12 10:58
最好在全部读出数据后再打印,因为打印有可能会影响SPI时序!

这样是不行的,你看啊 最后一个不是0x00 就是0xF8,除了这2个数据,就没读出其他的了,再看看前面原子哥的数据,高八位和低八位的数据都有很明显的变化,说明我的数据是不正常的
QQ截图20170112111144.jpg
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-12 11:27:26 | 显示全部楼层
GS1101923161 发表于 2017-1-12 11:14
这样是不行的,你看啊 最后一个不是0x00 就是0xF8,除了这2个数据,就没读出其他的了,再看看前面原子哥的 ...

那你就分析下这些数据是不是对的,你这不是ADC的值嘛,也比较好分析
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-12 13:28:33 | 显示全部楼层
lvkanger 发表于 2017-1-12 11:27
那你就分析下这些数据是不是对的,你这不是ADC的值嘛,也比较好分析

这数据是错的啊~~
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-12 15:21:15 | 显示全部楼层

是在不行,上示波器,抓波形吧!
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-12 15:24:50 | 显示全部楼层
lvkanger 发表于 2017-1-12 15:21
是在不行,上示波器,抓波形吧!

我放弃了~~心好累!!我把板子重新改了下,直接模拟SPI了~~
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
 楼主| 发表于 2017-1-12 15:25:38 | 显示全部楼层
lvkanger 发表于 2017-1-12 15:21
是在不行,上示波器,抓波形吧!

这读取的是触摸屏的按键数据,都是不固定的数据,拿示波器也不好测
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 11:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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