打印

7X256 SPI 的困惑

[复制链接]
1769|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
herowa|  楼主 | 2009-3-25 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
spi, at91, IO, se, TE
最近用AT91SAM7X256的SPI总线,想自己管理器件的CS线,只用芯片提供的MOSI、MISO和SCK进行数据收发,硬件安排为器件片选PA14(SPI0_NPCS2),使用SPI0。程序如下,但是读出的结果总是不对的。

初始化如下:
void SPI_init(void)
{
  AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI0);
  AT91C_BASE_PIOA->PIO_PDR = BSP_GPIOA_SPI0;
  AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SWRST;
  AT91C_BASE_SPI0->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_FDIV | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MODFDIS | AT91C_SPI_DLYBCS;
  AT91C_BASE_SPI0->SPI_CSR[2] = AT91C_SPI_CPOL | AT91C_SPI_DLYBS | AT91C_SPI_DLYBCT | AT91C_SPI_SCBR | AT91C_SPI_BITS_8;
  AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SPIEN;

//片选    
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
  AT91C_BASE_PIOA->PIO_PER = BSP_GPIOA_TEMP;
  AT91C_BASE_PIOA->PIO_OER = BSP_GPIOA_TEMP;
  AT91C_BASE_PIOA->PIO_IDR = BSP_GPIOA_TEMP;
  AT91C_BASE_PIOA->PIO_SODR = BSP_GPIOA_TEMP;
}

//发送字节
void SPI_SendByte(CPU_INT08U data)
{
    CPU_INT32U value_for_cs;
    value_for_cs = (~(1 << 2)) & 0xF;  //Place a zero among a 4 ONEs number
    AT91C_BASE_SPI0->SPI_TDR = ((CPU_INT32U)data & 0x000000FF) | (value_for_cs << 16);
    while((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_TXEMPTY == 0)) {
        ;
    }
}

//读取字节
CPU_INT32U SPI_RecByte(void)
{
    return((CPU_INT08U)(AT91C_BASE_SPI0->SPI_RDR & 0xFFFF));
}

进行读写操作时,片选我保证了有效。
因为第一次用,所以都摸不着头脑了。恳请有经验的朋友帮忙看看哪里出问题了,谢谢。

相关帖子

沙发
古道热肠| | 2009-3-26 10:53 | 只看该作者

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

使用特权

评论回复
板凳
wangkj| | 2009-3-26 13:25 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

52

帖子

0

粉丝