STM32 SPI单线双向模式控制tm1629

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

IO配置.png
spi读写函数.png
spi模式转换.png
SPI配置.png
hawksabre 发表于 2013-3-17 10:45 | 显示全部楼层
呵呵   谢谢楼主的例程   谢谢了  楼主   这个真的很不错哦   谢谢
 楼主| duljsky 发表于 2013-3-17 15:47 | 显示全部楼层
hawksabre 发表于 2013-3-17 10:45
呵呵   谢谢楼主的例程   谢谢了  楼主   这个真的很不错哦   谢谢

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

评论

[url=home.php?mod=space&uid=467710]@huangqi412[/url] :哥们, 你是在切换方向之前 关闭SPI吗? 能不贴出你的读写函数..  发表于 2018-6-28 14:57
我用F0 切换方向一定要关闭SPI才行 手册也没明确写要关 搜到你这个帖子然后尝试关闭再开 终于好了  发表于 2016-7-29 11:00
zydzjy 发表于 2013-3-20 21:58 | 显示全部楼层
大侠,你SPI操作了tm1629吗?请问你是SPI的哪种工作模式啊,为什么我老是读不到按键数据啊,显示是正常的,请教了,非常感谢~
 楼主| duljsky 发表于 2013-3-20 22:45 来自手机 | 显示全部楼层
zydzjy 发表于 2013-3-20 21:58
大侠,你SPI操作了tm1629吗?请问你是SPI的哪种工作模式啊,为什么我老是读不到按键数据啊,显示是正常的, ...

用的单线双向模式,上面代码应该写的很清楚吧!你读按键时读出的数据是乱的还是一点读不出?把代码贴出来看看~
zydzjy 发表于 2013-3-20 23:20 | 显示全部楼层
我的与你的估计不同,我不是用这个CPU,我是FPGA自己写的一个SPI模块,但是我显示是可以的,我不是单向模式,在读按键时,DIN输出0,使用SPI的模式3工作,读出来的按键是00
zydzjy 发表于 2013-3-20 23:34 | 显示全部楼层
你的代码是SPI空闲时是高电平,第一个时钟采样,是这样的吗?低电平读DOUT按键数据
1.jpg
 楼主| duljsky 发表于 2013-3-21 08:11 | 显示全部楼层
zydzjy 发表于 2013-3-20 23:34
你的代码是SPI空闲时是高电平,第一个时钟采样,是这样的吗?低电平读DOUT按键数据 ...

1629都是在时钟上升沿时输入输出数据,所以,我的SPI设置为时钟上升沿时输出到1629或者上升沿时读取1629,必须要同步。我软件模拟时也是一个IO口先输出低再输出高,之后接着读取单片机相应IO口(就是与1629Dout相连的IO)中的数据。您说的是低电平读取,是不是这个问题啊?
 楼主| duljsky 发表于 2013-3-21 12:10 | 显示全部楼层
zydzjy 发表于 2013-3-20 23:34
你的代码是SPI空闲时是高电平,第一个时钟采样,是这样的吗?低电平读DOUT按键数据 ...

请问您的问题解决了没有~
zydzjy 发表于 2013-3-21 14:21 | 显示全部楼层
咳,还没呢,纠结啊,我主要是问你的SPI设置的CPOL,CPHA设置的是什么值???
 楼主| duljsky 发表于 2013-3-21 14:25 | 显示全部楼层
zydzjy 发表于 2013-3-21 14:21
咳,还没呢,纠结啊,我主要是问你的SPI设置的CPOL,CPHA设置的是什么值??? ...

上边我贴的初始化程序有啊  全是1
zydzjy 发表于 2013-3-22 00:27 | 显示全部楼层
那你的SPI时钟频率是多少,16M可以吗?
 楼主| duljsky 发表于 2013-3-22 08:26 | 显示全部楼层
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

我设置的是60MHZ/256   设置我的系统上成最小了。16MHZ没用过,晚些时候可以试一试~
 楼主| duljsky 发表于 2013-3-22 08:45 | 显示全部楼层
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

我最高只能到500KHz,再高就接受的数据就是乱的,也许是我代码的问题,而且我提升频率,液晶也花了,呵呵~
 楼主| duljsky 发表于 2013-3-22 08:53 | 显示全部楼层
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

说错了,是配置成1MHz,您多尝试尝试吧~
 楼主| duljsky 发表于 2013-3-22 08:59 | 显示全部楼层
zydzjy 发表于 2013-3-22 00:27
那你的SPI时钟频率是多少,16M可以吗?

1629手册上说它的RC震荡是450KHz+5%,我感觉我的1Mhz也有水分,呵呵~
zydzjy 发表于 2013-3-22 11:30 | 显示全部楼层
不会吧,我软件模拟SPI CPU 16M都是可以的,你说的读写都是正边缘,应该是针对TM1629吧?对SPI来说,应该是向TM1629发数据时是SPI负边缘将数据发送到DIN,TM1629在正边缘去读;读TM1629按键时,TM1629会将数据在负边缘放到DOUT,SPI会在正边缘获取DOUT的数据,对吧?不知道我理解有无错误,另外,我的是DOUT,DIN分开使用,这个配置你试过吗?如果是短接在一起,说是要在读数据之前把DIO置1.这个怎么理解,如果我分开操作,如何设置~
 楼主| 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,但是没有下到,搜了好几份,但是**作的都是时钟上升沿来操作数据,希望您试一试~
zydzjy 发表于 2013-3-22 14:45 | 显示全部楼层
不管怎么样,如果你的SPI工作模式是设置成CPOL,CPHA都是1,我就知道了~
zydzjy 发表于 2013-3-22 14:45 | 显示全部楼层
你的时钟设置成几百K,那显示不会有抖动啊??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:日行一善

18

主题

127

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:日行一善

18

主题

127

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部