打印
[ZLG-ARM]

利用SSP接口接成SPI的问题

[复制链接]
5297|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiqiang|  楼主 | 2008-3-22 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用EasyARM2131开发板时,将SSP接成SPI接口来使用,调试一个语音芯片VS1003,如果采用软件仿真SPI,可以正常工作,但是使用SSP接成SPI则无法正常工作。代码如下:


     // 初始化硬件SSP接口

     SSPCR1 = 0x00;                              // 进行设置之前先关闭SSP使能,设置完成后才打开
     

     PINSEL1 |= 0x00A8;                             // 设置引脚连接为SSP

     SSPCR0 = (0x00 << 8) |                         // SPI 时钟设置,预分频时钟为0 
               (0x00 << 7) |                         // CPHA = 0, 
               (0x00 << 6) |                         // CPOL = 0, 
               (0x00 << 4) |                         // FRF 帧格式=SPI,
               (0x07 << 0);                          // DDS 数据长度 = 8, 
              
     SSPCR1 = (0x00 << 3) |                        // SOD 从机输出禁能
               (0x00 << 2) |                        // MS 主从选择 = 0,
               (0x00 << 1) |                        // SSE SPI 使能允许与其它设备通信
               (0x00 << 0) ;                        // LBM 回写模式, 
     
      SSPICR = 0x03;                                // 中断清除寄存器

     SSPCPSR= 20;                               // 时钟分频设置 

     SSPCR1 = 0x02;                             // 设置完成后才打开SSP使能



     for ( i = 0; i < 8; i++ )                    // clear the RxFIFO 
     {
       Dummy = SSPDR;    
     }

SSP接成SPI接口的收发数据函数

/********************************************************************** 

 函 数 名:VS1003_Send()
 功    能:给VS1003发一个字符(命令或数据)
 说    明:模块的内部函数,提供给本模块其他程序调用
 入口参数:send_buf:向VS1003写入的字符
 返 回 值:无  
 其他:    1.采用上升沿写入数据的SPI时序
           2.送数时高位先送
           3.没有控制CS
           4.注意方向:本函数是有主控制器向X5045发送,通过X5045_SI引脚送入数据
***********************************************************************/ 
 

void  VS1003_Send(INT8U  send_buf)
{
      
 
      // 采用SSP接口

      INT8U Dummy;    

      while ( !(SSPSR & 0x02) );                            // 发送缓冲区没满,向其中送入数据
      SSPDR = send_buf;
        while ( !(SSPSR & 0x10) );                            // 等待数据发送完
      
      // 以下为清除接收FIFO

      while ( SSPSR & 0x04 )                                // 接收缓冲区不为空,则一直将数据读出
      {
        Dummy = SSPDR;
        
        while ( !(SSPSR & 0x10) );                            // 等待数据接收完
      }
 
     
}  


/********************************************************************** 

 函 数 名:VS1003_Re()
 功    能:从VS1003接收一个字符
 说    明:模块的内部函数,提供给本模块其他程序调用
 入口参数:无
 返 回 值:rec_buf:读取的数据 
 其他:    1.采用下降沿读数的SPI时序
           2.读数时高位先读出
           3.注意方向:本函数是有主控制器从VS1003接收数据,通过VS1003_So引脚读入数据
***********************************************************************/ 
INT8U VS1003_Re(void)
{
     
    
     // 采用SSP接口
     
     INT8U rec_buf;     

     SSPDR =0xFF;

     while ( !(SSPSR & 0x10) );                            // 等待数据发送完

     rec_buf = SSPDR;

     return(rec_buf);
     






相关帖子

沙发
hotpower| | 2008-3-22 11:53 | 只看该作者

可以试试这个

使用特权

评论回复
板凳
qiqiang|  楼主 | 2008-3-22 14:10 | 只看该作者

RE

hotpower兄:
    我就是利用BUSY来判断的,还是无法正常啊。我看了你的例程,但是还是无法成功。请多指教,看看我的代码里面那里有不对的。

使用特权

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

本版积分规则

23

主题

43

帖子

2

粉丝