你(们)好
在中、我想知道、对于非 FIFO 模式下的 SPI:当我写入代码时:TXBUF=0x00、0x00将自动传输到 SPIDAT、然后传输开始。 当 SPIDAT 中的最后一位移出时、它将设置标志并触发中断。 我是对的吗? 为了接收、很容易理解、当 RXBUF 有数据时、它将设置标志并触发中断。
对于处于 FIFO 模式的 SPI:下面是"spi_loopback_interrupts_cpu01"中的代码
中断空 spiTxFifoIsr (空)
{
uint16 i;
// asm (" NOP");
for (i=0;i<2;i++)
{
SpiaRegs.SPITXBUF=sdata[i];//发送数据
}
for (i=0;i<2;i++)//增加下一个周期的数据
{
sdata[i]= sdata[i]+ 1;
}
SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACX.All|=0x20;//发出 PIE ACK
}
我观察到、每次执行"SpiaRegs.SPITXBUF=sdata[i]时、 RXFFST 位将增加1、这意味着 FIFO 字增加1。 那么、这是否意味着每次我向 SPITXBUF 写入内容时、该字都将放入 TX FIFO 中? 那么什么时候发送 FIFO 中的数据呢?
但 TRM 中的图片显示、SPITXBUF 似乎正在将数据从 FIFO 传送到 SPIDAT、它无法将数据放入 TX FIFO 中、因此在上述代码中、每次我写入 "SpiaRegs.SPITXBUF=sdata[i]时、sdata[i]确切的位置是什么? 数据将在何时传输?
和接收中断。 每次我读取 SPIRXBUF 两次时、似乎我从 RX_FIFO 读取数据、这与我在上面显示的图片不同。
中断空 spiRxFifoIsr (空)
{
uint16 i;
// asm (" NOP");
for (i=0;i<2;i++)
{
RDATA[I]=SpiaRegs.SPIRXBUF;//读取数据
}
for (i=0;i<2;i++)//检查接收到的数据
{
if (RDATA[i]!= RDATA_POIN+I)
{
error();
}
}