[ZLG-ARM] SPI通信出问题了

[复制链接]
 楼主| jstu023123 发表于 2008-4-11 17:17 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;2131SPI接收数据,主机(2214)P0.8控制从机2131SSEL,置为低电平。但从机接收第一个数据时,数据正确的,但S0PSR为0x88,从机中止啊,接下来的数据收不到了。而SSEL一直为低呀。。。我是采用中断接收的<br />&nbsp;&nbsp;&nbsp;&nbsp;想不通了<br /><br /><br />
lyl831015 发表于 2008-4-12 12:27 | 显示全部楼层

共地

两块板子共地了吗?
huangbingg 发表于 2008-4-12 12:31 | 显示全部楼层

为啥要共地啊?

2楼再解释下啊&nbsp;&nbsp;谢拉
 楼主| jstu023123 发表于 2008-4-12 13:29 | 显示全部楼层

回2楼

&nbsp;&nbsp;供地了啊,接收的第一个数据是对的。。。如果连续发同一个数据,第一次读的S0PSR为0x88,收到的数据正确,后面读的S0PSR则都为0x80,数据正确。也就是若主机发送一串数据,从机收到第一个数据后,S0PSR从机中止,下面就收不到数据了。。。
 楼主| jstu023123 发表于 2008-4-12 13:50 | 显示全部楼层

程序贴出来帮我看看啊。。。

2214主机发送数据是正确的,通过查询方式可以接收到任意字节,就是中断不行<br />程序如下:<br />#define&nbsp;&nbsp;SPI_RCV_BUF&nbsp;&nbsp;2<br />static&nbsp;UINT8&nbsp;rcv_buf[SPI_RCV_BUF];<br />static&nbsp;BOOL&nbsp;RcvFinished&nbsp;=&nbsp;FALSE;<br /><br />void&nbsp;__irq&nbsp;&nbsp;IRQ_SPI0(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT32&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;S0PSR;<br />&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf[0]&nbsp;=&nbsp;S0PDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;rcv_buf[1]&nbsp;=&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RcvFinished&nbsp;=&nbsp;TRUE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;S0PINT&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;<br />&nbsp;}<br /><br /><br />void&nbsp;SPI0_Init(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&nbsp;&&nbsp;(~(0xFF&nbsp;&lt&lt&nbsp;8)))&nbsp;|&nbsp;(0x55&nbsp;&lt&lt&nbsp;8)&nbsp;;&nbsp;&nbsp;&nbsp;//&nbsp;设置管脚连接SPI<br />&nbsp;&nbsp;&nbsp;&nbsp;S0PCR&nbsp;&nbsp;=&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;3)|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPHA&nbsp;=&nbsp;0,&nbsp;数据在SCK&nbsp;的第一个时钟沿采样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;4)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPOL&nbsp;=&nbsp;1,&nbsp;SCK&nbsp;为低有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MSTR&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;处于从模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;6)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;LSBF&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;数据传输MSB&nbsp;(位7)在先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;7);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPIE&nbsp;=&nbsp;1,&nbsp;SPI&nbsp;中断被使能<br />&nbsp;}<br /><br /><br />void&nbsp;SPI0_INT_Init(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;(0x20|10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(UINT32)IRQ_SPI0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;(1&lt&lt10);<br />&nbsp;}<br /><br /><br />UINT8&nbsp;SPI0_GetData(&nbsp;UINT8&nbsp;*pBuffer&nbsp;)<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;RcvFinished==TRUE)&nbsp;<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RcvFinished&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_COMPuts(&nbsp;rcv_buf,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;UART0_IsSendFinished()==0&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_ClearBuffer(&nbsp;TRUE,TRUE&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;return&nbsp;FALSE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TRUE;<br />&nbsp;}<br /><br /><br />int&nbsp;main(void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT8&nbsp;dat[256];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_Init(BPS9600,DB8,SB1,PB0);<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_INTInit(&nbsp;);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI0_Init(&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI0_INT_Init(&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable(&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;1&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI0_GetData(&nbsp;dat&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;i=0;i&lt0x9ffff;i++&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;}<br />
zlgarm 发表于 2008-4-12 17:12 | 显示全部楼层

Re

jstu023123&nbsp;&nbsp;您好:<br />请您注意LPC2131的引脚配置等硬件连接问题,您可参考《深入浅出ARM7—LPC213x/LPC214x》上册,SPI跟SSP通信等实验。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;duty&nbsp;:&nbsp;zlgarm_liuzhaofu
quhaoccnu 发表于 2008-4-15 21:45 | 显示全部楼层

SPI初始化问题

&nbsp;在《深入浅出ARM7LPC213x》上册的SPI主机实验中初始化接口代码如下:<br />void&nbsp;&nbsp;MSPI_Init(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPCCR&nbsp;=&nbsp;0x52;&nbsp;&nbsp;&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;&nbsp;SPCR&nbsp;&nbsp;=&nbsp;(0&nbsp;&lt&lt&nbsp;3)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPHA&nbsp;=&nbsp;0,&nbsp;数据在SCK&nbsp;的第一个时钟沿采样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;4)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPOL&nbsp;=&nbsp;1,&nbsp;SCK&nbsp;为低有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;//&nbsp;MSTR&nbsp;=&nbsp;1,&nbsp;SPI&nbsp;处于主模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;6)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;LSBF&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;数据传输MSB&nbsp;(位7)在先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPIE&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;中断被禁止<br />}<br /><br />请问SPI时钟分频设置为0x52的依据是什么?<br />而在《深入浅出ARM7LPC213x》下册的SPI初始化如下:<br />uint8&nbsp;SPIInit(uint8&nbsp;Fdiv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_SPCCR&nbsp;=&nbsp;Fdiv&nbsp;&&nbsp;0xfe;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;分频值&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_SPCR&nbsp;=&nbsp;0xa0&nbsp;|&nbsp;SPI_MOD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;主机、允许中断&nbsp;*/<br />}<br />这里的分频值设为0x80&nbsp;&&nbsp;0xfe,不同于上册的0x52,且SPCR的设置也不同于上册,ZLG大侠能否解释下?<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

93

帖子

0

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