STM32 + W5500 SPI DMA: программное обеспечение CS не согласовано с CLK - PullRequest
0 голосов
/ 04 ноября 2018

Я использую STM32F030 с W5500 и у меня проблемы с библиотекой HAL SPI. Сначала я использовал SPI (1 Мбит / с) без DMA, но Cortex M0 не поддерживает выравнивание данных, что приводит к hard_Fault. Чтобы избежать этого, они рекомендуют нам использовать SPI с DMA или IT.

Что ж, W5500 требует записи + чтения во время активации CS, поэтому я настроил CS для программного обеспечения.

Когда SPI записывает значение, он делает это правильно. Но когда используется функция чтения, CS деактивируется до завершения CLK.

Вот основная функция (оригинал из библиотек W5500):

void     WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
{
   uint8_t spi_data[3];
   uint16_t i;

   WIZCHIP_CRITICAL_ENTER();
   WIZCHIP.CS._select();

   AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);

   if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst)  // byte operation
   {
        WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
        WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
        WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
        for(i = 0; i < len; i++)
           pBuf[i] = WIZCHIP.IF.SPI._read_byte();
   }
   else                                                             // burst operation
   {
        spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
        spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
        spi_data[2] = (AddrSel & 0x000000FF) >> 0;
        WIZCHIP.IF.SPI._write_burst(spi_data, 3);
        WIZCHIP.IF.SPI._read_burst(pBuf, len);
   }

   WIZCHIP.CS._deselect();
   WIZCHIP_CRITICAL_EXIT();
}

WIZCHIP_CRITICAL_ENTER и EXIT являются нулевыми функциями. Выбор программного обеспечения CS выполняется (перенаправляется):

void    wizchip_cs_select(void)            {
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
}

void    wizchip_cs_deselect(void)          {
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
}

И функции записи / чтения:

uint8_t wizchip_spi_readbyte(void)        {
    uint8_t datain;
    uint8_t dataout=0xAA;
    HAL_SPI_TransmitReceive_DMA(&hspi1, &dataout, &datain, 1);
    return datain;
}

void    wizchip_spi_writebyte(uint8_t wb) {
    HAL_SPI_Transmit_DMA(&hspi1, &wb, 1);
}

void    wizchip_spi_readburst(uint8_t* pBuf, uint16_t len)  {
    uint8_t dataout=0xAA;
    HAL_SPI_TransmitReceive_DMA(&hspi1, &dataout, pBuf, len);
}

void    wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {
    HAL_SPI_Transmit_DMA(&hspi1, pBuf, len);
}

Это то, что я получаю, когда функция только для записи:

функция записи

И вот когда используется функция чтения:

введите описание изображения здесь

Почему это происходит ??

...