打印

STM32 SPI单线双向模式控制tm1629

[复制链接]
17039|65
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duljsky|  楼主 | 2013-3-16 20:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
由于之前没用过SPI总线,因为之前都是写的纯软的代码,刚接触单片机不久,所以有很多需要学习的地方!
tm1629的用法手册挺多的,网上可以搜到,就不贴出来了!
因为第一次用SPI所以还是听不容易的,难怪大神们不回复我提的问题,现在想来还是自己没仔细看好手册。
1、配置时钟相位时一定要和从设备一致;(我一开始设置的不对,导致写入数据时错位)
2、不像双向全双工一样,单线双向时不必读取和接受一并进行,反而会出错,导致意想不到的SCK产生。至少我是这样试过,最后读和写时分开的函数;
3、从只发和只读模式转换的时候,不必关掉SPI再重新配置,直接操作单个位就可以了;
还有一些小细节错误,我也忘记了,哈哈~
一下只是单线双向模式控制从设备的配置,1629的驱动函数就不给了,自己研究一下很快的!

SPI配置.png (31.58 KB )

SPI配置.png

spi模式转换.png (16.15 KB )

spi模式转换.png

spi读写函数.png (15.48 KB )

spi读写函数.png

IO配置.png (51.1 KB )

IO配置.png
沙发
hawksabre| | 2013-3-17 10:45 | 只看该作者
呵呵   谢谢楼主的例程   谢谢了  楼主   这个真的很不错哦   谢谢

使用特权

评论回复
板凳
duljsky|  楼主 | 2013-3-17 15:47 | 只看该作者
hawksabre 发表于 2013-3-17 10:45
呵呵   谢谢楼主的例程   谢谢了  楼主   这个真的很不错哦   谢谢

呵呵,不客气!  循环处理外部设备的话最好是及时 disable SPI,特别是有延时的循环处理时,因为我一加延时读取的数据就不对,所以,在读取完数据后我就关闭,等下次再读取时再打开,只处理外设使能位就可以了,其他设置不用重新配置。

使用特权

评论回复
评论
chinasz 2018-6-28 14:57 回复TA
@huangqi412 :哥们, 你是在切换方向之前 关闭SPI吗? 能不贴出你的读写函数.. 
huangqi412 2016-7-29 11:00 回复TA
我用F0 切换方向一定要关闭SPI才行 手册也没明确写要关 搜到你这个帖子然后尝试关闭再开 终于好了 
地板
zydzjy| | 2013-3-20 21:58 | 只看该作者
大侠,你SPI操作了tm1629吗?请问你是SPI的哪种工作模式啊,为什么我老是读不到按键数据啊,显示是正常的,请教了,非常感谢~

使用特权

评论回复
5
duljsky|  楼主 | 2013-3-20 22:45 | 只看该作者
zydzjy 发表于 2013-3-20 21:58
大侠,你SPI操作了tm1629吗?请问你是SPI的哪种工作模式啊,为什么我老是读不到按键数据啊,显示是正常的, ...

用的单线双向模式,上面代码应该写的很清楚吧!你读按键时读出的数据是乱的还是一点读不出?把代码贴出来看看~

使用特权

评论回复
6
zydzjy| | 2013-3-20 23:20 | 只看该作者
我的与你的估计不同,我不是用这个CPU,我是FPGA自己写的一个SPI模块,但是我显示是可以的,我不是单向模式,在读按键时,DIN输出0,使用SPI的模式3工作,读出来的按键是00

使用特权

评论回复
7
zydzjy| | 2013-3-20 23:34 | 只看该作者
你的代码是SPI空闲时是高电平,第一个时钟采样,是这样的吗?低电平读DOUT按键数据

1.jpg (14.34 KB )

1.jpg

使用特权

评论回复
8
duljsky|  楼主 | 2013-3-21 08:11 | 只看该作者
zydzjy 发表于 2013-3-20 23:34
你的代码是SPI空闲时是高电平,第一个时钟采样,是这样的吗?低电平读DOUT按键数据 ...

1629都是在时钟上升沿时输入输出数据,所以,我的SPI设置为时钟上升沿时输出到1629或者上升沿时读取1629,必须要同步。我软件模拟时也是一个IO口先输出低再输出高,之后接着读取单片机相应IO口(就是与1629Dout相连的IO)中的数据。您说的是低电平读取,是不是这个问题啊?

使用特权

评论回复
9
duljsky|  楼主 | 2013-3-21 12:10 | 只看该作者
zydzjy 发表于 2013-3-20 23:34
你的代码是SPI空闲时是高电平,第一个时钟采样,是这样的吗?低电平读DOUT按键数据 ...

请问您的问题解决了没有~

使用特权

评论回复
10
zydzjy| | 2013-3-21 14:21 | 只看该作者
咳,还没呢,纠结啊,我主要是问你的SPI设置的CPOL,CPHA设置的是什么值???

使用特权

评论回复
11
duljsky|  楼主 | 2013-3-21 14:25 | 只看该作者
zydzjy 发表于 2013-3-21 14:21
咳,还没呢,纠结啊,我主要是问你的SPI设置的CPOL,CPHA设置的是什么值??? ...

上边我贴的初始化程序有啊  全是1

使用特权

评论回复
12
zydzjy| | 2013-3-22 00:27 | 只看该作者
那你的SPI时钟频率是多少,16M可以吗?

使用特权

评论回复
13
duljsky|  楼主 | 2013-3-22 08:26 | 只看该作者
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

我设置的是60MHZ/256   设置我的系统上成最小了。16MHZ没用过,晚些时候可以试一试~

使用特权

评论回复
14
duljsky|  楼主 | 2013-3-22 08:45 | 只看该作者
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

我最高只能到500KHz,再高就接受的数据就是乱的,也许是我代码的问题,而且我提升频率,液晶也花了,呵呵~

使用特权

评论回复
15
duljsky|  楼主 | 2013-3-22 08:53 | 只看该作者
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

说错了,是配置成1MHz,您多尝试尝试吧~

使用特权

评论回复
16
duljsky|  楼主 | 2013-3-22 08:59 | 只看该作者
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

1629手册上说它的RC震荡是450KHz+5%,我感觉我的1Mhz也有水分,呵呵~

使用特权

评论回复
17
zydzjy| | 2013-3-22 11:30 | 只看该作者
不会吧,我软件模拟SPI CPU 16M都是可以的,你说的读写都是正边缘,应该是针对TM1629吧?对SPI来说,应该是向TM1629发数据时是SPI负边缘将数据发送到DIN,TM1629在正边缘去读;读TM1629按键时,TM1629会将数据在负边缘放到DOUT,SPI会在正边缘获取DOUT的数据,对吧?不知道我理解有无错误,另外,我的是DOUT,DIN分开使用,这个配置你试过吗?如果是短接在一起,说是要在读数据之前把DIO置1.这个怎么理解,如果我分开操作,如何设置~

使用特权

评论回复
18
duljsky|  楼主 | 2013-3-22 14:17 | 只看该作者
zydzjy 发表于 2013-3-22 11:30
不会吧,我软件模拟SPI CPU 16M都是可以的,你说的读写都是正边缘,应该是针对TM1629吧?对SPI来说,应该是 ...

首先,我是针对1629说的频率;其次,您说的边沿就不对,写入数据和读取数据没有您想象的那么慢的,1629是在上升沿被写入或者发送数据给MCU,所以,MCU的CLK只能配置成上升沿写或者读,不是您说的MCU下降沿发送1629正好上升沿接受,他们之间的通信是通过CLK同步进行的。分开我没试过~我在网上看的说直接短接就可以了,呵呵,您试一试吧,置1我也不理解。还有我有下的手册说是读取时是在下降沿,我就郁闷了,我用的1629d,但是没有下到,搜了好几份,但是**作的都是时钟上升沿来操作数据,希望您试一试~

使用特权

评论回复
19
zydzjy| | 2013-3-22 14:45 | 只看该作者
不管怎么样,如果你的SPI工作模式是设置成CPOL,CPHA都是1,我就知道了~

使用特权

评论回复
20
zydzjy| | 2013-3-22 14:45 | 只看该作者
你的时钟设置成几百K,那显示不会有抖动啊??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:日行一善

18

主题

127

帖子

1

粉丝