7X256 SPI 的困惑

[复制链接]
 楼主| herowa 发表于 2009-3-25 16:44 | 显示全部楼层 |阅读模式
spi, at91, IO, se, TE
最近用AT91SAM7X256的SPI总线,想自己管理器件的CS线,只用芯片提供的MOSI、MISO和SCK进行数据收发,硬件安排为器件片选PA14(SPI0_NPCS2),使用SPI0。程序如下,但是读出的结果总是不对的。<br /><br />初始化如下:<br />void&nbsp;SPI_init(void)<br />{<br />&nbsp;&nbsp;AT91C_BASE_PMC-&gtPMC_PCER&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;AT91C_ID_SPI0);<br />&nbsp;&nbsp;AT91C_BASE_PIOA-&gtPIO_PDR&nbsp;=&nbsp;BSP_GPIOA_SPI0;<br />&nbsp;&nbsp;AT91C_BASE_SPI0-&gtSPI_CR&nbsp;=&nbsp;AT91C_SPI_SWRST;<br />&nbsp;&nbsp;AT91C_BASE_SPI0-&gtSPI_MR&nbsp;=&nbsp;AT91C_SPI_MSTR&nbsp;|&nbsp;AT91C_SPI_FDIV&nbsp;|&nbsp;AT91C_SPI_PS_VARIABLE&nbsp;|&nbsp;AT91C_SPI_MODFDIS&nbsp;|&nbsp;AT91C_SPI_DLYBCS;<br />&nbsp;&nbsp;AT91C_BASE_SPI0-&gtSPI_CSR[2]&nbsp;=&nbsp;AT91C_SPI_CPOL&nbsp;|&nbsp;AT91C_SPI_DLYBS&nbsp;|&nbsp;AT91C_SPI_DLYBCT&nbsp;|&nbsp;AT91C_SPI_SCBR&nbsp;|&nbsp;AT91C_SPI_BITS_8;<br />&nbsp;&nbsp;AT91C_BASE_SPI0-&gtSPI_CR&nbsp;=&nbsp;AT91C_SPI_SPIEN;<br /><br />//片选&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;AT91C_BASE_PMC-&gtPMC_PCER&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;AT91C_ID_PIOA;<br />&nbsp;&nbsp;AT91C_BASE_PIOA-&gtPIO_PER&nbsp;=&nbsp;BSP_GPIOA_TEMP;<br />&nbsp;&nbsp;AT91C_BASE_PIOA-&gtPIO_OER&nbsp;=&nbsp;BSP_GPIOA_TEMP;<br />&nbsp;&nbsp;AT91C_BASE_PIOA-&gtPIO_IDR&nbsp;=&nbsp;BSP_GPIOA_TEMP;<br />&nbsp;&nbsp;AT91C_BASE_PIOA-&gtPIO_SODR&nbsp;=&nbsp;BSP_GPIOA_TEMP;<br />}<br /><br />//发送字节<br />void&nbsp;SPI_SendByte(CPU_INT08U&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CPU_INT32U&nbsp;value_for_cs;<br />&nbsp;&nbsp;&nbsp;&nbsp;value_for_cs&nbsp;=&nbsp;(~(1&nbsp;&lt&lt&nbsp;2))&nbsp;&&nbsp;0xF;&nbsp;&nbsp;//Place&nbsp;a&nbsp;zero&nbsp;among&nbsp;a&nbsp;4&nbsp;ONEs&nbsp;number<br />&nbsp;&nbsp;&nbsp;&nbsp;AT91C_BASE_SPI0-&gtSPI_TDR&nbsp;=&nbsp;((CPU_INT32U)data&nbsp;&&nbsp;0x000000FF)&nbsp;|&nbsp;(value_for_cs&nbsp;&lt&lt&nbsp;16);<br />&nbsp;&nbsp;&nbsp;&nbsp;while((AT91C_BASE_SPI0-&gtSPI_SR&nbsp;&&nbsp;AT91C_SPI_TXEMPTY&nbsp;==&nbsp;0))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//读取字节<br />CPU_INT32U&nbsp;SPI_RecByte(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return((CPU_INT08U)(AT91C_BASE_SPI0-&gtSPI_RDR&nbsp;&&nbsp;0xFFFF));<br />}<br /><br />进行读写操作时,片选我保证了有效。<br />因为第一次用,所以都摸不着头脑了。恳请有经验的朋友帮忙看看哪里出问题了,谢谢。
古道热肠 发表于 2009-3-26 10:53 | 显示全部楼层

最好找个官方参考例程看看.

  
wangkj 发表于 2009-3-26 13:25 | 显示全部楼层

如果不是spi总线上多器件,片选可以不用。

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

52

帖子

0

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