Я некоторое время пользуюсь платформой ATMEL START, и она отлично работала, но недавно я столкнулся с проблемой с SPI DMA.
Я использую осциллограф для наблюдения за выбором ведомого (SS)), тактовые сигналы (SCK) и MOSI. Когда я запускаю loopback без dma, все работает нормально (это означает, что драйвер SPI_Master_Async- или SPI_Master_Sync выбран в помощнике по настройке проекта ATMEL START). Когда dma включен, линия SCK поднимается высоко при сбросе, а затем правильно падает до низкого уровня при вызове функции atmel_start_init (). После этого линия часов просто находится на низком уровне, и ничего не происходит.
Помимо приведенного ниже кода, я попытался использовать _spi_m_dma_transfer напрямую, но это не сработало. Я не могу вмешиваться в это из-за причин. И руководство пользователя не очень помогает.
Это код:
main.c
int main(void)
{
/* Initializes MCU, drivers and middleware */
atmel_start_init();
ams_system32_setupGPIO(PIN_ABCC_SPI_SS, GPIO_DIRECTION_OUT, GPIO_PULL_OFF);
ams_system32_setupGPIO(PIN_LED, GPIO_DIRECTION_OUT, GPIO_PULL_OFF);
gpio_set_pin_level(PIN_ABCC_SPI_SS, 1);
gpio_set_pin_level(PIN_ABCC_SPI_SS, 0);
SPI_0_example();
while(1){}
}
driver_examples.c (предоставлен фреймворком, я не сделализмените это)
static uint8_t example_SPI_0[12] = "Hello World!";
static void tx_complete_cb_SPI_0(struct _dma_resource *resource)
{
/* Transfer completed */
}
void SPI_0_example(void)
{
struct io_descriptor *io;
spi_m_dma_get_io_descriptor(&SPI_0, &io);
spi_m_dma_register_callback(&SPI_0, SPI_M_DMA_CB_TX_DONE, (spi_m_dma_cb_t)tx_complete_cb_SPI_0);
spi_m_dma_enable(&SPI_0);
io_write(io, example_SPI_0, 12);
}
Это изображение конфигурации
Так почему это не работает? И как мне заставить его работать? Я что-то забыл?