阅读用户手册的第 19 章(SSP ...),我对用法的理解是我应该配置使用 SSP0(比如说)作为 SPI,然后使用类似于这样的代码:
void SSP_SPI_SR(uint16_t* sendBuffer, uint16_t* recvBuffer, uint8_t length)
{
uint8 len1 = length, len2 = length;
// Ensure SSP receive FIFO is empty (by reading data out of it if necessary)
while(SSP0SR & RNE) SSP0DR;
IOCLR0 = 0x00100000; // SSEL ac
tive (down)
while(len1 || len2)
{
if (len1 && (SSP0SR & TNF)) // Data to send and transmit FIFO isn’t full?
{
SSPODR = *sendBuffer++;
len1--;
//
// add a wait loop here if need to prevent buffer underrun at slave
}
if (len2 && (SSP0SR & RNE)) // Data to receive and receive FIFO has data available
{
*recvBuffer++ = SSP0DR;
len2--;
}
}
}
IOSET0 = 0x00100000; // SSEL inactive (up)
}
// Usage :
uint16_t pollSequence[9] = {0xEBEB, 0xEBEB, 0xEBEB,
0xEBEB, 0xEBEB, 0xEBEB,
0xEBEB, 0xEBEB, 0xFFFF};
uint16_t pollReplies[9] = {0};
SSP_SPI_SR(pollSequence, pollReplies, 9); 是对的吗?
如果是这样我很困惑!使用 CPOL=1,CPHA=0。第 19.5.2.4 节明确指出:
然而,在连续背靠背传输的情况下,SSEL 信号必须
在每次数据字传输之间脉冲为高电平。这是因为如果CPHA 位为逻辑零,从选择引脚
会冻结其串行外设寄存器中的数据并且不允许更改数据。
因此,主设备必须在每次数据传输之间拉高从设备的 SSEL 引脚
,以启用串行外设数据写入。连续传输完成后,SSEL 引脚在最后一位被捕获后的
一个 SCK 周期返回到空闲状态。