CC3200 SPI 从机接收不良

标签 c msp430 code-composer stm32f4

已解决:我必须处理从机的 CS/NSS 引脚。在 TX 之前和之后添加一些延迟。

void SlaveMain()
{
    MAP_SPIReset(GSPI_BASE);

    MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
                     SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0,
                     (SPI_SW_CTRL_CS |
                     SPI_4PIN_MODE |
                     SPI_TURBO_OFF |
                     SPI_CS_ACTIVELOW |
                     SPI_WL_8));

    MAP_SPIEnable(GSPI_BASE);
}

while(1)
{
    MAP_SPICSEnable(GSPI_BASE);
    MAP_SPIDataGet(GSPI_BASE, &data);
    Report("Got: %d\n\r", data);
    MAP_SPICSDisable(GSPI_BASE);
}

我的问题是我通过 SPI 从 STM32F4 板接收到错误的数据。我的 CC3200 板 SPI 从机配置:

#define SPI_IF_BIT_RATE  100000
void SlaveMain()
{
    // Set Tx buffer index
   ucTxBuffNdx = 0;
   ucRxBuffNdx = 0;

   // Reset SPI
   MAP_SPIReset(GSPI_BASE);

   // Configure SPI interface
   MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
                 SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0,
                 (SPI_SW_CTRL_CS |
                 SPI_4PIN_MODE |
                 SPI_TURBO_OFF |
                 SPI_CS_ACTIVEHIGH |
                 SPI_WL_8));

   // Register Interrupt Handler
   MAP_SPIIntRegister(GSPI_BASE,SlaveIntHandler);

   // Enable Interrupts
   MAP_SPIIntEnable(GSPI_BASE,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY);

   // Enable SPI for communication
   MAP_SPIEnable(GSPI_BASE);

   Message("Enabled SPI Interface in Slave Mode\n\rReceived : ");
}

中断:

static void SlaveIntHandler()
{
    unsigned long ulRecvData;
    unsigned long ulStatus;

    ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);

    MAP_SPIIntClear(SSPI_BASE,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY);

    if(ulStatus & SPI_INT_RX_FULL)
    {
    MAP_SPIDataGetNonBlocking(GSPI_BASE,&ulRecvData);
    Report("Received: %d\n\r",ulRecvData);
    }
}

以及我的 SPI Master 的 STM32F4 板配置:

void MX_SPI2_Init(void)
{
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;
  HAL_SPI_Init(&hspi2);
}

  uint8_t data;

  while (1)
  {
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
    data = 6;
    HAL_SPI_Transmit(&hspi2, &data, 1, 50);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
    HAL_Delay(500);
  }

我从 CC3200 得到的结果,在我重置主设备后它发生了变化: Wrong received data. Must show 6.

哪里可能有问题?

最佳答案

(从设备配置为软件控制的 CS/NSS 引脚,您当前不处理该引脚)。 SPI 通常使用 CS 引脚重新同步,因此如果传输中丢失了一位,或者从机在主机开始传输后启动),它目前将永远不会恢复(SPI 没有 START/STOP 位)。

关于CC3200 SPI 从机接收不良,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767482/

相关文章:

c - MSP430 TIMERA1 中断

c - MSP430:__delay_cycles() 很慢/MCLK 可能很慢

opencv - Code Composer(CCStudio)中的OpenCV代码

c - 标识符未定义

c - 将我的 .txt 文件打印到行和列时遇到问题,仅打印第一行

c - 错误 : called object is not a function

c - Linux 内核线程

crc - 使用内置函数计算 msp430f5438a 的 crc 的方法

c - 随机数 : either 0 or 1

c - MSP430 随机复位 'Security Violation (BOR)'