|
使用 SPI2口 连接外设 , 时钟速率 主频16M , SPI时钟2 分频 。 SPI2的时钟已经打开
SPI 配置部分为 :
SPI_SetSNNMode(SPI2,SPI_SSN_MODE_SOFTWARE);
/* 外设工作主从模式 */
SPI_SetSPIWorkMode(SPI2,SPI_WORK_MODE_MASTER);
/* 总线通讯速率 */
SPI_SetBaudrate(SPI2,SPI_BAUDRATEPRESCALER_DIV2);
/* 数据bit方向 */
SPI_SetBitOrder(SPI2,SPI_BIT_ORDER_MSB_FIRST);
/* 总线数据位宽 */
SPI_SetDataWidth(SPI2,SPI_DATAWIDTH_8BIT);
/* 时钟相位 */
SPI_SetClockPhase(SPI2,SPI_SPI_PHASE_1EDGE);
/* 传输模式 双工半双工 */
SPI_SetTransferMode(SPI2,SPI_MODE_FULL_DUPLEX);
/* 时钟极性 */
SPI_SetClockPolarity(SPI2,SPI_SPI_POLARITY_LOW);
SPI_SetSSNPinMode(SPI2 ,SPI_SSN_SEND_MODE_LOW) ;
SPI_SetSNNMode(SPI2,SPI_SSN_MODE_SOFTWARE);
SPI_TxBuffClear(SPI2);
SPI_RxBuffClear(SPI2);
使用SPI传输数据时 (lp 为缓冲区指针,用于存储发送数据并接收返回数据) 代码为 :
SPI_Enable(SPI2);
i = SPI2->RXBUF ;
LowCS();
for( i = 0; i < len; i++ )
{
SPI2->TXBUF = *lp;
while(SPI2->ISR & 0x3)
__nop();
*lp = SPI2->RXBUF;
lp++;
}
HighCS();
SPI_Disable(SPI2);
问题是 程序会卡在 while(SPI2->ISR & 0x3) __nop(); 原因是 检测不到 ISR Bit0 位 为1 , 该位始终为 0 .
将这一句该位用BUSY 检测 : while(SPI2->ISR & 0x10) __nop(); 可以运行下去, 但运行中概率出现 读到的值为上一次读取到的值的问题
也就是说 似乎是 还未收数据完毕 就已经执行了 *lp = SPI2->RXBUF 。 请问 是哪里有配置错误码 ?
|
|