[ZLG-ARM] ZLG 213X的SSP例程会害死人的.

[复制链接]
4110|1
 楼主| 21班猪 发表于 2007-12-14 03:50 | 显示全部楼层 |阅读模式
lg, AC, TE, TI, rc
unsigned&nbsp;char&nbsp;SSP_SendData(unsigned&nbsp;char&nbsp;&nbsp;data)<br />{&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;IOCLR&nbsp;=&nbsp;SLAVE_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&Ntilde;&iexcl;&Ocirc;&ntilde;&acute;&Oacute;&raquo;ú&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SSPDR&nbsp;=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(SSPSR&nbsp;&&nbsp;0x01)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&micro;&Egrave;&acute;&yacute;TFE&Ouml;&Atilde;&Icirc;&raquo;&pound;&not;&frac14;&acute;·&cent;&Euml;&Iacute;FIFO&iquest;&Otilde;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;IOSET&nbsp;=&nbsp;SLAVE_CS;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(SSPDR);<br />}<br /><br />大家发觉有什么问题没有?<br /><br />刚开始用时就怀疑有问题的,后来使用证实确实存在问题,<br />不应该发送FIFO空就返回数据。应该SSP空闲时反回数据<br />unsigned&nbsp;char&nbsp;SSP_SendData(unsigned&nbsp;char&nbsp;&nbsp;data)<br />{&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;IOCLR&nbsp;=&nbsp;SLAVE_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&Ntilde;&iexcl;&Ocirc;&ntilde;&acute;&Oacute;&raquo;ú&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SSPDR&nbsp;=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(SSPSR&nbsp;&&nbsp;0x10)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&micro;&Egrave;&acute;&yacute;TFE&Ouml;&Atilde;&Icirc;&raquo;&pound;&not;&frac14;&acute;·&cent;&Euml;&Iacute;FIFO&iquest;&Otilde;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;IOSET&nbsp;=&nbsp;SLAVE_CS;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(SSPDR);<br />}
hotpower 发表于 2007-12-14 06:59 | 显示全部楼层

哈哈~~~1年半前菜地已经遇到和指出过此问题了~~~

菜地早发现此问题:&nbsp;<a href="https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2140869" target=_blank>https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2140869</a><br />unsigned&nbsp;char&nbsp;AdsObj::AdsReadWriteByte(unsigned&nbsp;char&nbsp;cData)&nbsp;<br />{<br />&nbsp;&nbsp;SSP-&gtSSP_DR&nbsp;=&nbsp;cData;<br />//&nbsp;&nbsp;while(&nbsp;!(SSP-&gtSSP_SR&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;TFE))&nbsp;);//&nbsp;等待TFE置位,即发送FIFO空&nbsp;&nbsp;&nbsp;<br />//应该改为:<br />&nbsp;&nbsp;while(&nbsp;SSP-&gtSSP_SR&nbsp;&&nbsp;(1&nbsp;&lt&lt&nbsp;BSY)&nbsp;);//&nbsp;等待BSY清零,即控制器空闲&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;return&nbsp;SSP-&gtSSP_DR;<br />}<br /><br /><br />不过IAR的例程为:(通过验证没问题)<br /><br />/*************************************************************************<br />&nbsp;*&nbsp;Function&nbsp;Name:&nbsp;MmcTranserByte<br />&nbsp;*&nbsp;Parameters:&nbsp;Int8U&nbsp;ch<br />&nbsp;*&nbsp;Return:&nbsp;Int8U<br />&nbsp;*<br />&nbsp;*&nbsp;Description:&nbsp;Read&nbsp;byte&nbsp;from&nbsp;SPI<br />&nbsp;*<br />&nbsp;*************************************************************************/<br />Int8U&nbsp;MmcTranserByte&nbsp;(Int8U&nbsp;ch)<br />{<br />&nbsp;&nbsp;while(!SSPSR_bit.TNF);<br />&nbsp;&nbsp;SSPDR&nbsp;=&nbsp;ch;<br />&nbsp;&nbsp;while(!SSPSR_bit.RNE);<br />&nbsp;&nbsp;return((Int8U)SSPDR);<br />}<br /><br />/*************************************************************************<br />&nbsp;*&nbsp;Function&nbsp;Name:&nbsp;MmcSendBlock<br />&nbsp;*&nbsp;Parameters:&nbsp;pInt8U&nbsp;pData,&nbsp;Int32U&nbsp;Size<br />&nbsp;*<br />&nbsp;*&nbsp;Return:&nbsp;void<br />&nbsp;*<br />&nbsp;*&nbsp;Description:&nbsp;Read&nbsp;byte&nbsp;from&nbsp;SPI<br />&nbsp;*<br />&nbsp;*************************************************************************/<br />void&nbsp;MmcSendBlock&nbsp;(pInt8U&nbsp;pData,&nbsp;Int32U&nbsp;Size)<br />{<br />Int32U&nbsp;OutCount&nbsp;=&nbsp;Size;<br />&nbsp;&nbsp;while&nbsp;(OutCount)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(SSPSR_bit.TNF&nbsp;&&&nbsp;OutCount)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSPDR&nbsp;=&nbsp;*pData++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--OutCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;while&nbsp;(SSPSR_bit.RNE&nbsp;||&nbsp;!SSPSR_bit.TFE)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;Int32U&nbsp;Dummy&nbsp;=&nbsp;SSPDR;<br />&nbsp;&nbsp;}<br />}<br /><br />/*************************************************************************<br />&nbsp;*&nbsp;Function&nbsp;Name:&nbsp;MmcReceiveBlock<br />&nbsp;*&nbsp;Parameters:&nbsp;pInt8U&nbsp;pData,&nbsp;Int32U&nbsp;Size<br />&nbsp;*<br />&nbsp;*&nbsp;Return:&nbsp;void<br />&nbsp;*<br />&nbsp;*&nbsp;Description:&nbsp;Read&nbsp;byte&nbsp;from&nbsp;SPI<br />&nbsp;*<br />&nbsp;*************************************************************************/<br />void&nbsp;MmcReceiveBlock&nbsp;(pInt8U&nbsp;pData,&nbsp;Int32U&nbsp;Size)<br />{<br />Int32U&nbsp;Delta&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;while&nbsp;(Size&nbsp;||&nbsp;Delta)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(SSPSR_bit.TNF&nbsp;&&&nbsp;(Delta&nbsp;&lt&nbsp;SSP_FIFO_SIZE)&nbsp;&&&nbsp;Size)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSPDR&nbsp;=&nbsp;0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Size;&nbsp;++Delta;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(SSPSR_bit.RNE)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*pData++&nbsp;=&nbsp;SSPDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Delta;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br /> <br /> 相关链接:<a href='http://blog.**/hotpower/68890/message.aspx'>http://blog.**/hotpower/68890/message.aspx</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

90

帖子

0

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