我使用ATMEL START框架已有一段时间,并且效果很好,但是最近我遇到了SPI DMA的问题。
我正在使用示波器观看从设备选择(SS),时钟(SCK)和MOSI信号。 当我在没有dma的情况下运行环回时,一切工作正常(这意味着使用ATMEL START项目配置助手中选择的SPI_Master_Async-或SPI_Master_Sync驱动程序)。 启用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);
}
那为什么不起作用?以及如何使它工作?我忘了什么吗?