实现功能
主控(Amlogic A113X)串口和MCU(STM32) 进行串口通信,实现数据的传输,由STM32控制灯效.看似简单的一个双方对接功能,还是走了不少弯路的.
串口DTS配置
//Amlogic A113X引脚编号
GPIOZ_8 -> I2C_SCK_B/UART_TX_AO_B
GPIOZ_9 -> I2C_SDA_B/UART_RX_AO_B
根据引脚功能中UART_RX_AO_B和dts中的serial2 = &uart_AO_B对应
aliases {
serial0 = &uart_AO;
serial1 = &uart_A;
serial2 = &uart_AO_B;
serial3 = &uart_B;
};
uart_AO_B: serial@4000 {
compatible = "amlogic, meson-uart";
reg = <0x0 0x4000 0x0 0x18>;
interrupts = <0 197 1>;
status = "okay";
clocks = <&xtal>;
clock-names = "clk_uart";
fifosize = < 64 >;
pinctrl-names = "default";
pinctrl-0 = <&ao_b_uart_pins>;
};
//串口正常加载之后,会显示
ls /dev/ttyS0
ttyS0 ttyS1 ttyS2 ttyS3
MCU进行通信
- 首先调用A方提供的动态库, 通过
file *so
发现是MIPS格式,而A113X需要的是
file xxx.so
xxx.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=2a8193fca2caa7fcb9f62120f8bd34152a38ee9b, not stripped
- 写了一个小的测试程序,验证的动态库,如下 :
arm-linux-xxx/g++ -W -Wall -O2 -g -std=c++11 -Wl,-rpat=.-o xxx xxx.cpp -L . -lxxxx -lpthread
A方提供的MCU程序使用C++ 11实现,这点还是值得学习的
- 调试
发现LED没有反应,这个时候只能单独测试, 通过PC的串口验证,也不行,只能排查硬件.
意外发现MCU和主控的 RX / TX接反了, 修改后正常.
经验说明项目的手板什么低级的硬件错误都可以犯, 还是要静下心来分析问题,解决问题
这次的坑:
- 功放IIC通讯不成功, 功放IIC SDA SCL 短路导致
- 串口和外设通讯不成功, RX/TX接反