我在使用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);
}
|