2016-04-21 80 views
0

解決:我必須處理從機的CS/NSS引腳。在TX之前和之後添加一些延遲。CC3200 SPI從機壞接收

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主我的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.

哪裏可能是一個問題?

+0

'Report()'做了什麼?從中斷處理程序調用它是否安全? –

+0

它通過窗口打印。 Printf給出相同的值。 –

回答

1

(從站配置爲SW控制的CS/NSS引腳,目前您不處理)。 SPI通常使用CS引腳進行重新同步,所以如果在傳輸過程中丟失一個位,或者從器件在主器件開始傳輸後啓動),它將不會恢復(SPI沒有START/STOP位)。

+0

就是這樣!我處理SW控制的CS/NSS引腳,並且工作完美。謝謝。 –

+0

@TomasAušvicas如果是這樣,你應該將其標記爲已接受的答案。 – HeadCode

0

我假設HAL_GPIO_WritePin是您的芯片選擇線。由於SPI串行傳輸數據,在所有位發送之前(特別是由於SPI時鐘通常只有約4MHz),您可能會設置GPIO(並禁用SPI通信)。檢查/發佈HAL_SPI_Transmit函數中的代碼,看它是否在返回之前檢查某種SPI就緒位。出於調試目的,請嘗試在每個HAL_GPIO_WritePin調用之前添加一些延遲。另外,請檢查SPI寄存器的位長。您可能已將它配置爲8位傳輸,但如果寄存器實際上是16位或32位,則傳輸的數據在寫入之前可能需要左對齊(例如,如果在16位數據傳輸上傳輸8位數據,則​​0xFF變爲0xFF00) bit SPI寄存器)。