打印
[ZLG-ARM]

利用SSP接口接成SPI的问题

[复制链接]
2871|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiqiang|  楼主 | 2008-3-24 13:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用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);
     



相关帖子

沙发
zlgarm| | 2008-3-24 21:05 | 只看该作者

SSP做为SPI使用

qiqiang  您好:

   问题应该是您的SSP接口时序不对,关于SSP做SPI的应用,您可以参考我们光盘中的相应程序来写。
   对于如何设置时序您可以看下面说明.
                                 on duty:zlgarm_zhanghuping

使用特权

评论回复
板凳
minicaihong| | 2010-12-17 09:22 | 只看该作者
我的也是我是用的一个tft液晶

使用特权

评论回复
地板
hotpower| | 2010-12-18 07:34 | 只看该作者
可以的

使用特权

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

本版积分规则

23

主题

43

帖子

2

粉丝