[ZLG-ARM] 请教一个关于LPC2142的SPI的问题

[复制链接]
2111|1
 楼主| definitely 发表于 2007-8-31 12:02 | 显示全部楼层 |阅读模式
<br />本人在使用LPC2142的SPI总线读写数据的时候,出现了这样的现象:<br />在向SPI的数据寄存器S0PDR写入数据后,发现SPI状态寄存器S0PSR变为0x40,而在未写入之前,SPI状态寄存器S0PSR的值为0x00。<br />&nbsp;&nbsp;&nbsp;&nbsp;IO1CLR&nbsp;=&nbsp;SPI_Enable;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//片选SPI器件<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart0_SendByte(S0PSR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取SPI状态寄存器,发现值为0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;S0PDR&nbsp;&nbsp;=&nbsp;0x05;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将数据写入SPI数据寄存器S0PDR<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart0_SendByte(S0PSR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取SPI状态寄存器,发现值为0x40<br />&nbsp;&nbsp;&nbsp;&nbsp;while(0&nbsp;==&nbsp;(S0PSR&nbsp;&&nbsp;0x80));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待数据发送完毕<br />查阅得知是写冲突(WCOL),资料上说:先通过读取该寄存器,清零WCOL位,再访问SPI数据寄存器。&nbsp;我也按照这个方法做了,但是还是同样的现象。<br />&nbsp;&nbsp;&nbsp;&nbsp;IO1CLR&nbsp;=&nbsp;SPI_Enable;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//片选SPI器件<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart0_SendByte(S0PSR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取SPI状态寄存器,发现值为0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;dat&nbsp;&nbsp;=&nbsp;S0PSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先读取S0PSR寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart0_SendByte(dat);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送串口输出<br />&nbsp;&nbsp;&nbsp;&nbsp;S0PDR&nbsp;&nbsp;=&nbsp;0x05;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将数据写入SPI数据寄存器S0PDR<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart0_SendByte(S0PSR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取SPI状态寄存器,发现值为0x40<br />&nbsp;&nbsp;&nbsp;&nbsp;while(0&nbsp;==&nbsp;(S0PSR&nbsp;&&nbsp;0x80));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待数据发送完毕<br /><br />请问:<br />1、什么是写冲突?是上一个数据没有发送完毕还是什么?<br />2、主器件的SPI状态寄存器是否受从器件的影响?<br />3、主器件的发送模式是不是必须和从器件的接收模式相匹配?<br /><br />谢谢!
zlgARM 发表于 2007-9-1 11:00 | 显示全部楼层

definitely

您好:<br />&nbsp;&nbsp;&nbsp;&nbsp;答复如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、写冲突<br />&nbsp;&nbsp;&nbsp;&nbsp;当数据尚未发送完,就往SPI里丢待发送数据,会导致写冲突错误;<br />&nbsp;&nbsp;&nbsp;&nbsp;2、状态寄存器&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;状态寄存器的状态位是否置位,受相关的事件影响(请查询用户手册),而这些事件是和从机有关系的。<br />&nbsp;&nbsp;&nbsp;&nbsp;3、匹配<br />&nbsp;&nbsp;&nbsp;&nbsp;帧格式必须匹配。A讲日语,B讲阿拉伯语,那么A和B怎么能沟通?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

128

帖子

2

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