一、硬件介绍
因为选择的板卡是FRDM-MCXN947,没有板载的蓝牙模块或外设。所以只能外接一个蓝牙模块。我选择蓝牙模块是W02。实物如下图

W02蓝牙模块参数
蓝牙BLE5.2
单模透传
工作频率:2.4GHz
可视距离:100M
传输速率:BLE 35KB/S
发射功率:-20 dBm~8 dBm
接收灵敏度:-94dBm@1Mbps
支持UART、IIC、SPI和GPIO硬件连接
工作温度:-40℃~+85℃
天线采用板载天线
二、接线方式
W02的通信方式是UART,刚开始准备打开除shell使用的串口外的其他串口。按照AI和Zephyr源码库的例程生成.overlay文件打开串口。但是编译一直失败。最后只能使用shell的调试串口,不仅能够成功驱动W02蓝牙模块,而且也可以通过串口软件监视MCU发送的数据。

图中仅显示TX和RX的接线方式,VCC和GND接板卡的3V3和GND引脚就可以了。
三、流程图

四、驱动程序
因为串口的波特率是9600,而且串口使用的是与shell相同的串口,所以需要修改Zephyr源码库的文件。对应文件的路径和文件名为zephyr\boards\nxp\frdm_mcxn947\frdm_mcxn947.dtsi,找到flexcomm4_lpuart4参数选项,修改current-speed的参数为9600。尝试过通过AT指令修改为115200,但是效果是通信失败。也可以通过代码进行修改,但是没有直接修改源文件方便。修改后的内容如下

驱动W02的代码也是比较简单,首先是获取串口的句柄
#define UART_BLE_NODE DT_NODELABEL(flexcomm4_lpuart4) static const struct device *uart1_dev = DEVICE_DT_GET(UART_BLE_NODE);
然后是串口的发送函数
// 串口发送
static void uart_send_str(const char *str)
{
while (*str) {
uart_poll_out(uart1_dev, *str++);
}
}上电后需要进行一些配置,不过也可以忽略掉,直接发送数据。初始化指令集为
const char *at_init_seq[] = {
"AT\r\n",
"AT+NAME=MCXN947_W02\r\n",
"AT+BAUD=3\r\n",
"AT+RESET\r\n"
};五、效果展示
因为修改了源代码的参数,所以用串口软件打开的波特率要修改为9600。使用的是电脑软件BLEDebug进行蓝牙数据传输的调试功能。打开后直接连接对应的蓝牙,然后在对应的UUID中接收数据。数据内容和串口软件的内容显示的一样的。

六、问题总结
MCXN947的串口和引脚定义如下
串口 | RXD(FCx_P0) | TXD(FCx_P1) | 备注 (FRDM 开发板常用) |
FC0_UART0 | P0_0 | P0_1 | Arduino D1/D0 |
FC1_UART1 | P0_2 | P0_3 | 通用扩展串口 |
FC2_UART2 | P4_2 | P4_3 | MCU-Link 虚拟串口 (ARD D0/D1) |
FC3_UART3 | P1_0 | P1_1 | mikroBUS 默认串口 |
FC4_UART4 | P1_8 | P1_9 | 开发板默认调试串口(console) |
FC5_UART5 | P1_16 | P1_17 | 常用外设串口 |
FC6_UART6 | P2_0 | P2_1 | J3 扩展排针 |
FC7_UART7 | P2_1 | P2_2 | J3 扩展排针 |
FC8_UART8 | P2_2 | P2_3 | J3 扩展排针 |
FC9_UART9 | P2_4 | P2_3 | 语音模块常用串口 (P2.4RX/P2.3TX) |
他们都是在FlexComm总线下,表中的FC代表的是不同的FlexComm总线。每个FlexComm总线可以用作I2C或UART或SPI。在zephyr\boards\nxp\frdm_mcxn947路径下的frdm_mcxn947.dtsi文件内有所有默认的MCXN947的外设使能。如果需要打开其他的外设,则在工程根目录下新建一个app.overlay文件即可,文件内容和frdm_mcxn947.dtsi内容一样,是frdm_mcxn947.dtsi的补充内容,在程序编译的时候会将app.overlay文件的内容和frdm_mcxn947.dtsi合并一起称为设备树配置文件去配置外设。刚开始通过AI生成app.overlay文件内容,但是编译一直报错,后来改过外设名称和prj.conf文件内容都是不行。所以考虑用已经使能好的串口进行蓝牙数据传输。刚开始看原理图发现调试串口没有单独引出来,而是直接连接到USB上了。不过后来发现在J9座子有引出,所以就使用该串口进行蓝牙数据传输。对应的原理图如下

七、相关文件
我要赚赏金
