This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件: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;
}
请指出我需要在此代码中进行的更改。
您好、Nibit、
这是预期行为。 每当主器件发送数据时、它也将始终接收数据。 您可以通过完全断开 SOMI 连接来验证这一点。 接收引脚上的任何电压都将被移入 SPIDAT、并在传输完成后传输到 SPIRXBUF 中。
从器件端也会发生同样的情况 只要主器件开始传输、从器件就会开始将 SPIDAT 寄存器中的任何内容移出主器件(假设 SPISTE 处于活动状态)。
我建议使用您在应用中不会看到的预定义值、并使用该值初始化 SPI 从器件。 然后、您可以在主代码中检查是否收到该值、如果收到、则不要继续进行另一次传输。 或者、您可以了解程序的流程、并知道您从主器件发出的第一个传输将从从器件接收垃圾数据。
此致、
Kris
您好、Nibit、
主器件将始终接收*什么内容*。 如果您不希望从器件传输数据、则可以在确实需要从器件传输任何数据的消息上将 SPISTE 信号切换到标准 GPIO 设置为高电平(禁用 SPI 从器件传输)。 在这种情况下、主器件将接收到引脚上的任何值-可能是全0或全1。
此致、
Kris
您好、Nibit、
我理解这个问题。 此问题需要由您的应用软件处理。
替代方法是使用不具有主/从关系的不同通信协议、或使用第二个 SPI 端口、以便每个器件都是主器件和从器件。 如果您使用第二个 SPI 端口、则只需要额外的两个引脚、因为您不再需要 SPISTE 引脚。
但是、我认为软件可能是您的最佳解决方案。
此致、
Kris
您好、Nibit、
SPI 主器件在移出数据时始终移入数据。 即使 MISO 线路未连接、SPI 也无法知道这一点。 它只是将引脚上的电压解释为时钟接收边沿上的位。 没有来自从器件的独立信号、指示是否存在有效数据。 引脚上的任何电压都将被解释为传入数据、因为无法发出其他通知。
这与第一次传输时从器件的情况类似。 尽管从机未加载要发送的数据、但在接收数据时它始终会移出 SPIDAT 中的数据。
此致、
Kris