Я использую 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);
}
Это то, что я получаю, когда функция только для записи:
функция записи
И вот когда используется функция чтения:
введите описание изображения здесь
Почему это происходит ??