AT917S256 的SPI通信实现

来源:互联网 发布:淘宝的数字暗语大全 编辑:程序博客网 时间:2024/04/30 10:18


/*****************************************************************************
** 函数名称:SPI_init()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
* 作  者:sin
日期:2008/01/17
******************************************************************************/
void SPI_init (void)
{
                  
   pPMC->PMC_PCER = (1<<AT91C_ID_SPI);
   
   pPIO->PIO_PPUER = (AT91C_PA12_MISO );

   pPIO->PIO_PDR = (AT91C_PA12_MISO |
              AT91C_PA13_MOSI |
                AT91C_PA14_SPCK );
   
   pPIO->PIO_ASR = (AT91C_PA12_MISO |
              AT91C_PA13_MOSI |
                AT91C_PA14_SPCK);        
               
   pSPI->SPI_MR = (AT91C_SPI_MSTR |   //SPI为主机模式
             AT91C_SPI_PS_FIXED |     //固定外设器件
             AT91C_SPI_MODFDIS |      //模式错误检测禁止
             (0xE<<16));
   
   pSPI->SPI_CSR[0] = ((1<<24) | //连续传输间延迟
             (20<<16) |           //SPCK前延时
             (50<<8) |            //算拨特率的 SCBR 初始值
              (0<<1)|             //数据在SPCK的下降改变,在SPCK的开始边沿捕捉
             //AT91C_SPI_NCPHA |    //
             AT91C_SPI_CPOL |     //SPCK无效状态时,其逻辑值为1
             AT91C_SPI_BITS_8 );  //8位传输

   pSPI->SPI_CR = AT91C_SPI_SPIEN;
}
/********************************************************************************************************
* 函数名称:MSPI_SendData()
* 函数功能:向SPI总线发送数据。
* 入口参数:bsend
* 出口参数:返回值为读取的数据
* 作  者:sin
日期:2008/01/17
********************************************************************************************************/

unsigned char MSPI_SendData(unsigned char bsend)
{
 while( !(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE )){;}
 // wait until all transfers are completed
 AT91C_BASE_SPI->SPI_TDR =  bsend;
//transmit
 while( !(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF )){;}
 // wait for received char
 return (unsigned char)( AT91C_BASE_SPI->SPI_RDR );
}