我在使用EasyARM2131开发板时,将SSP接成SPI接口来使用,调试一个语音芯片VS1003,如果采用软件仿真SPI,可以正常工作,但是使用SSP接成SPI则无法正常工作。代码如下:<br /><br /><br /> // 初始化硬件SSP接口<br /><br /> SSPCR1 = 0x00; // 进行设置之前先关闭SSP使能,设置完成后才打开<br /> <br /><br /> PINSEL1 |= 0x00A8; // 设置引脚连接为SSP<br /><br /> SSPCR0 = (0x00 << 8) | // SPI 时钟设置,预分频时钟为0 <br /> (0x00 << 7) | // CPHA = 0, <br /> (0x00 << 6) | // CPOL = 0, <br /> (0x00 << 4) | // FRF 帧格式=SPI,<br /> (0x07 << 0); // DDS 数据长度 = 8, <br /> <br /> SSPCR1 = (0x00 << 3) | // SOD 从机输出禁能<br /> (0x00 << 2) | // MS 主从选择 = 0,<br /> (0x00 << 1) | // SSE SPI 使能允许与其它设备通信<br /> (0x00 << 0) ; // LBM 回写模式, <br /> <br /> SSPICR = 0x03; // 中断清除寄存器<br /><br /> SSPCPSR= 20; // 时钟分频设置 <br /><br /> SSPCR1 = 0x02; // 设置完成后才打开SSP使能<br /><br /><br /><br /> for ( i = 0; i < 8; i++ ) // clear the RxFIFO <br /> {<br /> Dummy = SSPDR; <br /> }<br /><br />SSP接成SPI接口的收发数据函数<br /><br />/********************************************************************** <br /><br /> 函 数 名:VS1003_Send()<br /> 功 能:给VS1003发一个字符(命令或数据)<br /> 说 明:模块的内部函数,提供给本模块其他程序调用<br /> 入口参数:send_buf:向VS1003写入的字符<br /> 返 回 值:无 <br /> 其他: 1.采用上升沿写入数据的SPI时序<br /> 2.送数时高位先送<br /> 3.没有控制CS<br /> 4.注意方向:本函数是有主控制器向X5045发送,通过X5045_SI引脚送入数据<br />***********************************************************************/ <br /> <br /><br />void VS1003_Send(INT8U send_buf)<br />{<br /> <br /> <br /> // 采用SSP接口<br /><br /> INT8U Dummy; <br /><br /> while ( !(SSPSR & 0x02) ); // 发送缓冲区没满,向其中送入数据<br /> SSPDR = send_buf;<br /> while ( !(SSPSR & 0x10) ); // 等待数据发送完<br /> <br /> // 以下为清除接收FIFO<br /><br /> while ( SSPSR & 0x04 ) // 接收缓冲区不为空,则一直将数据读出<br /> {<br /> Dummy = SSPDR;<br /> <br /> while ( !(SSPSR & 0x10) ); // 等待数据接收完<br /> }<br /> <br /> <br />} <br /><br /><br />/********************************************************************** <br /><br /> 函 数 名:VS1003_Re()<br /> 功 能:从VS1003接收一个字符<br /> 说 明:模块的内部函数,提供给本模块其他程序调用<br /> 入口参数:无<br /> 返 回 值:rec_buf:读取的数据 <br /> 其他: 1.采用下降沿读数的SPI时序<br /> 2.读数时高位先读出<br /> 3.注意方向:本函数是有主控制器从VS1003接收数据,通过VS1003_So引脚读入数据<br />***********************************************************************/ <br />INT8U VS1003_Re(void)<br />{<br /> <br /> <br /> // 采用SSP接口<br /> <br /> INT8U rec_buf; <br /><br /> SSPDR =0xFF;<br /><br /> while ( !(SSPSR & 0x10) ); // 等待数据发送完<br /><br /> rec_buf = SSPDR;<br /><br /> return(rec_buf);<br /> <br /><br /><br />} <br /><br /><br /><br /> |
|