2016-04-21 6 views
0

Решено: мне пришлось обрабатывать вывод CS/NSS для подчиненного устройства. Добавьте задержку до и после TX.CC3200 SPI Slave bad receive

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

Моя проблема в том, что я получаю неверные данные с платы STM32F4 через SPI. Моя 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); 
    } 
} 

И мой STM32F4 плат конфигурация для 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); 
    } 

Результата я получаю от CC3200 и меняется после того, как сбросить Ведущее устройство: Wrong received data. Must show 6.

Где может быть проблема?

+0

Что делает «Сообщить()»? Безопасно ли это вызывать из обработчика прерываний? –

+0

Он печатает через окно. Printf дает те же значения. –

ответ

1

(Ведомое устройство сконфигурировано для штырьков CS/NSS, управляемых SW, и вы в настоящее время этого не обрабатываете). SPI обычно использует CS-штырь для повторной синхронизации, поэтому, если один бит потерян в вашей передаче или ведомый запускается после того, как мастер начал передавать), он в настоящее время не восстанавливается (у SPI нет бит START/STOP).

+0

Вот и все! Я обработал штырь CS/NSS, управляемый SW, и работает отлично. Спасибо. –

+0

@ TomasAušvicas Если это так, вы должны отметить это как принятый ответ. – HeadCode

0

Я предполагаю, что HAL_GPIO_WritePin - ваша линия выбора чипа. Поскольку SPI последовательно передает данные, возможно, вы установите GPIO (и отключите связь SPI) до того, как все биты были отправлены (особенно, поскольку часы SPI обычно составляют всего около 4 МГц). Проверьте/опубликуйте код в функции HAL_SPI_Transmit и посмотрите, проверяет ли он какой-либо бит готовности SPI перед возвратом. Для целей отладки попробуйте добавить некоторую задержку до каждого вызова HAL_GPIO_WritePin. Также проверьте длину бита регистра SPI. Возможно, вы сконфигурировали его для 8-битных передач, но если регистр на самом деле равен 16 или 32 бит, тогда переданные данные, возможно, необходимо будет выровнять по левому краю перед записью (например, 0xFF становится 0xFF00, если передача 8-битных данных на 16- бит SPI).