在近期的产品开发中,我们需要使用STM32配置AD9361芯片。在之前的项目中,我们使用verilog进行纯逻辑配置,但是动态修改参数比较麻烦,所以我们花了些时间,最终成功地将AD9361 no-OS驱动移植到了STM32单片机上。这个过程使用的是ADI的no-OS 2018_R1版本,STM32的初始化工程是由STM32CubeMX生成的,可以参照小站的另一篇文章:
https://www.witimes.com/stm32cubemx-generate-stm32-initial-code/
本文只给出AD9361驱动移植到STM32单片机的关键点,后续有时间再整理出完整过程。我们知道,AD9361可以使用SPI接口进行配置,同时我们知道AD9361 no-OS驱动中支持串口命令行,显而易见,我们要用到STM32单片机的USART及SPI接口。同时,AD9361需要复位信号,所以还需要用到STM32的GPIO。
SPI读写相关的函数都在platform.c中,需要将其更换为STM32 HAL库支持的读写方式,将spi_read及spi_write_then_read改为HAL库的HAL_SPI_Receive,HAL_SPI_Transmit函数,同时配合片选信号的拉低、拉高实现对AD9361的读写;
AD9361的串口命令行主要涉及到两个文件,一个是由STM32CubeMX生成的usart.c,一个是AD9361 no-OS驱动中所包含的console.c。其中usart.c需要重定向fputc函数为 HAL_UART_Transmit,开启中断接收HAL_UART_Receive_IT,修改回调函数HAL_UART_RxCpltCallback;console.c需要修改uart_writer_char、uart_read_char及console_get_command函数。另外console.c中有很多命令是在FPGA平台上才能实现的,例如产生单音信号,需要通过数据接口向AD9361的DAC写入相应的数据,这部分功能的实现显然无法通过STM32单片机来实现,因此需要禁用这些命令;
AD9361的复位信号通过对特定GPIO的拉高、拉低实现,调用HAL库的HAL_GPIO_WritePin函数;
no-OS中的config.h需要按需调整,例如我们实际使用的芯片是AD9363,不使用AXI_ADC;
这次的驱动程序移植过程中,花费时间最多的地方就是zmalloc函数引起的bug,将startup_stm32f103xe.s文件中的Stack_Size和Heap_Size修改为0x800,可以解决问题;
我们使用的硬件,AD9361的SPI接口并未与STM32单片机相连,而是采用了AD9361<->FPGA<->MCU的方式,这样可以省掉一颗逻辑电平转换芯片,只需要在FPGA中做一个组合逻辑就可以实现MCU与AD9361的互通,只是要注意输入输出的方向。
移植成功的AD9631 no-OS驱动程序及串口命令行运行演示如下:
由STM32单片机通过SPI接口向AD9361下发配置指令,配合FPGA的数据输出、数据采集的演示如下:
这次移植过程参阅了大量的网络资料,本文就不一一给出了。