- SPI2 DMA configuration is as follows:
#define SPI2_DMA_RX_IRQHandler DMAC1_CH5_IRQHandler
#define SPI2_RX_DMA_IRQ_PRIO 0
#define SPI2_RX_DMA_INSTANCE DMA1_Channel5
#define SPI2_RX_DMA_IRQ DMAC1_CH5_IRQn
#define SPI2_DMA_TX_IRQHandler DMAC1_CH8_IRQHandler
#define SPI2_TX_DMA_IRQ_PRIO 0
#define SPI2_TX_DMA_INSTANCE DMA1_Channel8
#define SPI2_TX_DMA_IRQ DMAC1_CH8_IRQn
- Software initialization configuration:
rt_device_t spi_bus = rt_device_find(SPI_BUS_NAME);
if (spi_bus)
{
rt_device_open(spi_bus, RT_DEVICE_FLAG_RDWR);
LOG_D("Find spi bus %s:%x\n", SPI_BUS_NAME, spi_bus);
spi_dev_handle = (struct rt_spi_device *)rt_device_find(ADC_DEVICE_NAME);
if (spi_dev_handle == NULL)
{
rst = rt_hw_spi_device_attach(SPI_BUS_NAME, ADC_DEVICE_NAME);
spi_dev_handle = (struct rt_spi_device *)rt_device_find(ADC_DEVICE_NAME);
if (spi_dev_handle == NULL)
{
LOG_E("Register spi_dev spi device fail\n");
return -RT_ERROR;
}
}
rst = rt_device_open((rt_device_t)(spi_dev_handle),
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX);
spi_dev_cfg.data_width = 16; // bits
spi_dev_cfg.max_hz = ADC_SAMPLE_SPEED; // Hz
spi_dev_cfg.mode = RT_SPI_MODE_3 | RT_SPI_MSB | RT_SPI_MASTER;
spi_dev_cfg.frameMode = RT_SPI_TI; // RT_SPI_MOTO; // RT_SPI_TI;
rst = rt_spi_configure(spi_dev_handle, &spi_dev_cfg);
LOG_D("rt_spi_configure result:%d", rst);
}
- Data reading:
rt_spi_transfer((struct rt_spi_device *)spi_dev_handle, ping_buffer, ping_buffer, ADC_BUFFER_SIZE);
It has been observed that, probabilistically, after certain power-on cycles, no data can be read — the system continuously experiences DMA timeout. However, the board functions normally again after a reboot.
