主题中讨论的其他器件:TMS320F28379D、 DRV8711
工具/软件:Code Composer Studio
您好!
这是 TMS320F28379D (主器件)和 TMS32F28035 (从器件)之间的 SPI 通信。 这里唯一奇怪的信号是 SOMI。 主设备和从设备上的回送模式都关闭。 当从器件发回某些数据或者如果主器件上的回送模式打开时、主器件应该在 SPIRXBUF 上获得数据。 从器件有一个 SPIRXISR、每当从器件接收到来自主器件的数据并将其发送回主器件时执行该 SPIRXISR。
根据我的当前代码、当主器件向从器件发送1-16位字时、主器件在 SOMI 线上接收回0。 从器件应将接收到的数据发送回主器件。 我希望主器件等到它接收回发送给从器件的数据、然后发送第二个16位字。 但是、根据我在主器件上的当前 SPI 初始化、当主器件向从器件发送数据时、它会在 MISO 引脚上接收数据、然后从器件甚至可以接收和发回数据。 主器件在接收到该意外数据时发送第二个字。
|
主机发送 |
主机接收 |
从机接收 |
|
1 |
0 |
|
|
2. |
1 |
1 |
|
已完成发送 |
2. |
2. |
从机接收到正确的数据。 但我不希望主设备仅在从设备发送数据时才接收数据。
预期:
|
主机发送 |
主机接收 |
从机接收 |
|
1 |
|
|
|
|
1 |
1 |
|
2. |
|
|
|
|
2. |
2. |
主代码:
void SPI_Fifo_init()
{
//初始化 SPI FIFO 寄存器
SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置 SPI
SpiaRegs.SPICCR.All=0x000F; //16位字符、环回模式
SpiaRegs.SPICTL.All=0x001F; //中断被启用,主/从 Xmit 被启用
SpiaRegs.SPISTS.All=0x0000;
SpiaRegs.SPIBRR.All=0x000A; //波特率
SpiaRegs.SPIFFTX.All=0xC022; //启用 FIFO、将 TX FIFO 级别设置为4
SpiaRegs.SPIFFRX.All=0x0021; //将 RX FIFO 电平设置为4
SpiaRegs.SPIFFCT.All=0x00;
SpiaRegs.SPIPRI.All=0x0010;
SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
SpiaRegs.SPICCR.bit.SPISWRESET=1; //启用 SPI
}
void main(){
sdata = 0x0001;
SpiaRegs.SPITXBUF=sdata;
while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
sdata = 0x0002;
SpiaRegs.SPITXBUF=sdata;
while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
sdata = 0x00AA;
SpiaRegs.SPITXBUF=sdata;
while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
sdata = 0x0003;
SpiaRegs.SPITXBUF=sdata;
while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}
while (1){};
}
从器件代码:
_interrupt void spiRxFifoIsr (void)
{
RDATA = SpiaRegs.SPIRXB;
SpiaRegs.SPITXBUF = RDATA;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACX.All|=0x20; //发出 PIE ACK
}
void SpiaRegisterInit(){
SpiaRegs.SPICCR.All=0x000F; //16位字符、环回模式
SpiaRegs.SPICTL.All=0x001B; //中断被启用、主/从 Xmit 被启用
SpiaRegs.SPISTS.All=0x0000;
SpiaRegs.SPIBRR=0x000A; //波特率
SpiaRegs.SPIFFTX.All=0xE022;
SpiaRegs.SPIFFRX.All=0x0021;
SpiaRegs.SPIFFCT.All=0x00;
SpiaRegs.SPIPRI.All=0x0010;
SpiaRegs.SPICCR.bit.SPISWRESET=1; //启用 SPI
SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
}
请指出我需要在此代码中进行的更改。