I.MX6U-ALPHA开发板RS232/485/GPS驱动实验核心总结
一、实验核心原理
正点原子I.MX6U-ALPHA开发板的RS232、RS485、GPS三个外设,硬件上全部挂载在芯片UART3串口接口。三者无需单独编写专属驱动,统一依赖Linux UART3串口驱动,底层通信逻辑完全一致,仅硬件电平转换、外设参数、接线配置不同。
Linux内核已由NXP官方完成I.MX6U系列UART底层驱动开发,基于标准UART驱动框架与Platform驱动模型,开发者无需编写底层寄存器操作代码,仅需修改设备树配置启用UART3外设,系统启动后自动匹配驱动、生成设备节点,即可实现串口通信。
二、Linux标准UART驱动核心框架
Linux串口驱动为通用分层框架,所有串口设备均遵循该逻辑,核心由三大结构体和配套API构成:
1. uart_driver:串口驱动主体结构体,描述驱动名称、设备号、设备数量等全局信息。通过 uart_register_driver 注册驱动, uart_unregister_driver 注销驱动。
2. uart_port:代表单个具体串口端口,包含寄存器地址、中断号、波特率、硬件参数、底层操作函数集等核心信息,是硬件与驱动的衔接载体。通过 uart_add_one_port 绑定驱动与端口, uart_remove_one_port 解除绑定。
3. uart_ops:串口底层操作函数集,封装串口初始化、收发数据、启停传输、参数配置、中断处理等底层硬件操作,直接对接芯片寄存器,是串口数据通信的核心执行单元。
三、I.MX6U官方UART驱动适配逻辑
1.设备树匹配:设备树 uart3 节点通过 compatible 属性匹配内核 imx.c 驱动文件中的平台驱动匹配表,实现设备与驱动自动绑定。
2. 驱动初始化流程:驱动入口函数注册 uart_driver ,设备匹配成功后触发 probe 函数,完成串口物理地址映射、中断申请、时钟配置、 uart_port 初始化、绑定 uart_ops 底层操作函数,最终将端口挂载到驱动框架。
3. 设备节点生成:UART3启用成功后,系统自动生成设备文件 /dev/ttymxc2 ,应用层通过读写该文件完成RS232、485、GPS的数据交互。
四、硬件电路逻辑
1.RS232:通过SP3232电平转换芯片实现TTL串口转RS232电平,依靠JP1跳线帽切换硬件通路,连接UART3收发引脚。
2. RS485:通过SP3485芯片实现电平转换,硬件将收发控制引脚合一,无需额外IO控制收发状态,可直接当作普通串口使用,简化驱动与应用开发。
3.GPS模块:适配ATK1218-BD北斗GPS模块,直接复用UART3串口引脚,独立硬件接口,无需电平转换,上电即可通过串口输出定位数据。
五、设备树开发核心步骤
1. 配置引脚复用:在设备树 iomuxc 节点中添加UART3的pinctrl配置,指定TX、RX引脚功能,同时屏蔽占用该引脚的其他外设配置,保证引脚专属UART3。
2. 启用UART3节点:新增 uart3 设备节点,绑定引脚配置、设置 status = "okay" ,删除冲突的默认uart2节点。
3. 编译生效:重新编译设备树,烧录启动后校验 /dev/ttymxc2 节点是否生成。
六、调试工具minicom移植与使用
minicom是Linux端串口调试工具,用于串口数据收发、GPS数据抓取,移植依赖ncurses库:
1. 移植依赖库:交叉编译ncurses库,将库文件、头文件、配置文件拷贝至开发板对应系统目录,配置环境变量。
2. 移植minicom:基于交叉编译器编译minicom源码,生成可执行文件并移植到开发板。
3. 通用串口配置:固定8位数据位、1位停止位、无硬件/软件流控;RS232、RS485默认波特率115200bps,ATK1218-BD GPS模块默认波特率38400bps。
七、三大外设测试要点
1. RS232测试:JP1跳线接入RS232通路,电脑串口助手与开发板minicom配对,实现双向数据收发测试。
2. RS485测试:JP1跳线接入RS485通路,外接USB转485模块,严格遵循A接A、B接B接线规则,避免极性接反导致通信失败。
3. GPS测试:断开RS232/485跳线,插入GPS模块并外接天线,天线置于户外空旷处;模块首次启动需几分钟搜星,搜星成功后持续输出NMEA-0183格式定位报文。
八、关键注意事项
1. 引脚冲突是设备树配置最常见问题,修改后必须确认UART3收发引脚无其他外设复用。
2. RS485极性不可接反,否则完全无法通信。
3. GPS室内基本无法搜星,必须户外使用,波特率与常规串口不同,配置错误会出现乱码。
4. 三个外设硬件通路互斥,同一时间仅能启用一种外设,需通过跳线切换。