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.

[参考译文] TMS320F28379D:SPI MISO 线路未正确接收数据

Guru**** 2774345 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1618368/tms320f28379d-spi-miso-line-is-not-properly-receiveing-the-data

部件号: TMS320F28379D

静态 void SPIB_DEV_GPIO_Init (void)

  /* MOSI */
  GPIO_setPinConfig (GPIO_63_SPISIMOB);
  GPIO_setPadConfig (63、GPIO_PIN_TYPE_PULLUP);
  GPIO_setQualificationMode (63、GPIO_QUAL_ASYNC);
  GPIO_setDirectionMode (63、GPIO_DIR_MODE_IN);

  /* MISO */
  GPIO_setPinConfig (GPIO_64_SPISOMIB);
  GPIO_setPadConfig (64、GPIO_PIN_TYPE_PULLUP);
  GPIO_setQualificationMode (64、GPIO_QUAL_ASYNC);
  GPIO_setDirectionMode (64、GPIO_DIR_MODE_OUT);

  /* SCLK */
  GPIO_setPinConfig (GPIO_65_SPICLKB);
  GPIO_setPadConfig (65、GPIO_PIN_TYPE_PULLUP);
  GPIO_setQualificationMode (65、GPIO_QUAL_ASYNC);
  GPIO_setDirectionMode (65、GPIO_DIR_MODE_IN);

  /* CS—硬件 SPISTE(关键)*/
  GPIO_setPinConfig (GPIO_66_SPISTEB);
  GPIO_setDirectionMode (66、GPIO_DIR_MODE_IN);
  GPIO_setPadConfig (66、GPIO_PIN_TYPE_PULLUP);
  GPIO_setQualificationMode (66、GPIO_QUAL_ASYNC);
}

//void SPIB_InitTx (void)
//{
//  int i;
//  for (i=0;i<8;i++)
//  {
//    SPI_writeDataNonBlocking (SPIB_BASE、txBuffer[i]);
//  }
//}

void SPIB_DEV_Init (void)

  SysCtl_enablePeripheral (SYSCTL_PERIPH_CLK_SPIB);
  SPIB_DEV_GPIO_Init();
  SPI_disableModule (SPIB_BASE);

  SPI_setConfig (SPIB_BASE、
         DEVICE_LSPCLK_FREQ、
         SPI_PROT_POL0PHA0、 //必须与 Zynq spidev 匹配
         SPI_MODE_peripheral、
         0、          //在从器件中忽略
         8);         // spidev 默认值


  SPI_enableFIFO (SPIB_BASE);
   SPI_disableLoopback (SPIB_BASE);
   SPI_setEmulationMode (SPIB_BASE、SPI_emulation_free_run);


  SPI_clearInterruptStatus (SPIB_BASE、
               SPI_INT_RXFF | SPI_INT_RX_OVERLAR);
//
//  SPI_setFIFOInterruptLevel (SPIB_BASE、
//                SPI_FIFO_TX0、
//                SPI_FIFO_RX1); // 1 个字节上产生 RX 中断

//  SPI_enableInterrupt (SPIB_BASE、
//             SPI_INT_RXFF | SPI_INT_RX_OVERLAR);
//  spi_disableInterrupt (SPIB_base、
//             SPI_INT_RXFF | SPI_INT_RX_OVERLAR);

  /*预加载第一个字节、使第一个时钟不发送垃圾*/
//  SPI_writeDataNonBlocking (SPIB_BASE、txdata);
  // SPIB_InitTx ();
  SPI_resetTxFIFO (SPIB_BASE);
  SPI_resetRxFIFO (SPIB_BASE);
  SPI_writeDataNonBlocking (SPIB_BASE、txdata);
  txIndex = 1;

  SPI_enableModule (SPIB_BASE);

 


}


void SPIB_Poll (void)

  uint8_t rxData;
 // uint8_t txdata = 0x22;

  /*检查主器件是否发送 1 个字节*/
  IF (SPI_getRxFIFOStatus (SPIB_BASE)>= SPI_FIFO_RX1)
  {
    uint8_t rxData =(uint8_t)(SPI_readDataNonBlocking (SPIB_BASE)& 0xFF);
   // uart_printf(“                \r\n“);
    UART_printf(“slave Received:0x%02x\r\n“、rxData);
   // UART_printf(“================================ \r\n“);
    /*准备回应*/
    uint8_t response = rxData + 1; //示例逻辑

    /*等待 TX FIFO 有空间*/
    while (SPI_getTxFIFOStatus (SPIB_BASE)= SPI_FIFO_TXFULL);

    /*在下一个主时钟之前加载响应*/
    SPI_writeDataNonBlocking (SPIB_BASE、RESPONSE);

    UART_printf(“从器件响应:0x%02x\r\n“,响应);
  }

  /*处理超限*/
  IF (SPI_getInterruptStatus (SPIB_BASE)& SPI_INT_RX_overlast)
  {
    UART_printf(“SPI RX 溢出!\r\n“);

    SPI_resetRxFIFO (SPIB_BASE);
    SPI_resetTxFIFO (SPIB_BASE);
    SPI_clearInterruptStatus (SPIB_BASE、SPI_INT_RX_overlast);
  }
}

 


我正在检查处理器和控制器之间的 SPI 通信、其中处理器充当主器件、控制器充当从器件。 从处理器到控制器的 MOSI 通信正常工作、控制器正在接收数据。 但是、处理器没有通过 MISO 线路接收数据。

我探测并验证了数据是否正在从控制器的 MISO 线路传输。 然而、传输的数据始终为零。 我还尝试了修改逻辑以发回接收到的数据加一、甚至尝试发送硬编码数据、但问题仍然存在。

 

解决此问题的任何建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rishikesh:

    如果 F2837xD 是外设/从器件、那么您会说来自 F2837xD 的传输出现问题? 您能否尝试单步进入下行并在单步进入时监视 SPIFFTX 寄存器 (Continuous Refresh 切换为 ON)? TXFFST 是否会随着每次写入而增加?

    SPI_writeDataNonBlocking(SPIB_BASE,response);
    
    

    当主/控制器器件开始发送数据时、SPIDAT 是否会以写入 TX FIFO 的数据进行更新?

    此致、

    Delaney