6回答

0收藏

【PSoC3心得】GPIO输出函数注意事项

英飞凌 英飞凌 4376 人阅读 | 6 人回复 | 2013-08-23

  首先请允许我说:“老子信了你的邪!”
  注意控制情绪,不过每次出现各种蛋疼问题(但是一解决才发现是那么简单的细节问题),我还是希望可以释放下情绪。
  这是一个关于PSoC的GPIO的故事,故事的开始可以模拟串行时序说起。
  用软件模拟各种通信协议是每一个单片机初学者会做的事,这可以让我们对时序更加了解。比如,用软件模拟SPI时序。SPI有MSB传输和LSB传输,当我们要模拟MSB传输时,我们怎么做呢?用51时,我们会这样写MOSI = (txData & 0x80),然后再移位,等等。用PSoC时我们当然也可以这样做,因为IDE生成了API,于是我们可能会这样写MOSI_Write(txData & 0x80)。好像很合理吧!恩,我也觉得很合理,于是乎我被很合理地整了,于是乎我很合理地花半天时间来调试一个刚刚在另外一款单片机调试成功的代码,于是乎我很合理的在这里写检讨。
  为什么错呢?首先问一下txData & 0x80是多少呢?无非是0和1嘛!错,又错了,是0和0x80!对,因为我们一直想着要对IO口写0或1,于是我们连这个这么明显的问题都懒得思考,直接躺枪。对一个IO口写0x80是什么呢?IO口只能写0或1,写任意非0的数他怎么处理呢?那完全要看API函数怎么写了。我们来看下PSoC的GPIO写函数是如何实现的吧!
  1. void MOSI_Write(uint8 value)
  2. {
  3. uint8 staticBits = MOSI_DR & ~MOSI_MASK;
  4. MOSI_DR = staticBits | ((value << MOSI_SHIFT) & MOSI_MASK);
  5. }
复制代码
value << MOSI_SHIFT,先将value的最低位(注意:是最低位)移到IO口对应的地址偏移,再& MOSI_MASK。于是,其实value所有有效的数据其实只是其最低位,其他位根本无效,写0x80还是和写0是一样的。好吧,就是这么个细节问题,却可以让忽然间对自己的智商表示很怀疑,忽然间觉得1+1是不是等于1.
  好吧,老子信了你的邪!在最后给出改进方案吧:很简单,数据类型强制转换 MOSI_Write((bit)(value & 0x80))
  
分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

小王子_3031746

发表于 2013-8-23 22:49:22 | 只看该作者

3和4的区别到底在哪??
板凳

zca123

发表于 2013-8-23 23:39:16 | 只看该作者

haojingyan
地板

ming1006

发表于 2013-8-23 23:49:56 | 只看该作者

小王子 发表于 2013-8-23 22:49
3和4的区别到底在哪??

这个...
5#

ming1006

发表于 2013-8-23 23:50:40 | 只看该作者

zca123 发表于 2013-8-23 23:39
haojingyan

请使用合法汉语
6#

feiante

发表于 2013-8-30 12:00:16 | 只看该作者

3和4区别应该是内核不同吧
7#

ming1006

发表于 2013-8-30 17:50:57 | 只看该作者

feiante 发表于 2013-8-30 12:00
3和4区别应该是内核不同吧

主要是这个啦
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条