2016-04-21 31 views
0

Gelöst: Ich musste CS/NSS Pin für Slave behandeln. Fügen Sie eine Verzögerung vor und nach dem Senden hinzu.CC3200 SPI Slave schlecht erhalten

Mein Problem ist, dass ich falsche Daten von STM32F4 Board über SPI erhalten. Mein CC3200 Board SPI Slave-config:

#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 : "); 
} 

Interrupt:

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); 
    } 
} 

Und mein STM32F4 Board Config für SPI Master:

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); 
    } 

Ergebnis ich von CC3200 und es ändert sich, nachdem ich zurückgesetzt Master-Gerät: Wrong received data. Must show 6.

Wo könnte ein sein Problem?

+0

Was macht 'Report()'? Ist es sicher, es von einem Interrupt-Handler aus aufzurufen? –

+0

Es wird über ein Fenster gedruckt. Printf gibt dieselben Werte. –

Antwort

1

(Slave ist auf SW-gesteuerten CS/NSS-Pin konfiguriert, und Sie derzeit nicht damit umgehen). SPI verwendet normalerweise CS-Pin zum Resynchronisieren, wenn also ein Bit in Ihrer Übertragung verloren geht oder der Slave startet, nachdem der Master mit dem Senden begonnen hat, wird es sich momentan nie erholen (SPI hat keine START/STOP-Bits).

+0

Das war's! Ich habe SW-gesteuerte CS/NSS-Pins bearbeitet und es funktioniert perfekt. Vielen Dank. –

+0

@ TomasAušvicas Wenn das war, sollten Sie dies als die akzeptierte Antwort markieren. – HeadCode

0

Ich nehme an, HAL_GPIO_WritePin ist Ihre Chip-Auswahl-Zeile. Da SPI Daten seriell überträgt, ist es möglich, dass Sie den GPIO einstellen (und die SPI-Kommunikation deaktivieren), bevor alle Bits gesendet wurden (insbesondere, da der SPI-Takt normalerweise nur ~ 4 MHz beträgt). Überprüfen Sie den Code in der HAL_SPI_Transmit-Funktion und stellen Sie fest, ob er vor der Rückgabe nach einer Art SPI-Ready-Bit sucht. Versuchen Sie zu Debuggingzwecken vor jedem HAL_GPIO_WritePin-Aufruf eine Verzögerung hinzuzufügen. Überprüfen Sie auch die Bitlänge des SPI-Registers. Sie haben es möglicherweise für 8-Bit-Übertragungen konfiguriert, aber wenn das Register tatsächlich 16 oder 32 Bit ist, müssen die übertragenen Daten möglicherweise vor dem Schreiben linksbündig sein (z. B. 0xFF wird 0xFF00, wenn 8-Bit-Daten auf einem 16- Bit SPI-Register).