NXP MCU 技术论坛
直播中

杨勇

8年用户 1271经验值
私信 关注
[问答]

LPC2388在使用SSP0进行SPI通信时切换*SSEL的疑问求解

阅读用户手册的第 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 active (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 周期返回到空闲状态。

更多回帖

发帖
×
20
完善资料,
赚取积分