本帖最后由 小马哥-1650185 于 2017-7-3 15:03 编辑
【LPC54114双核任务二】双核之从零开始--番外篇#WIFI双核通信测试#
(本帖含 PC服务端 和 手机服务端 兼顾测试)
有了上贴有了上贴【LPC54114双核任务二】双核之从零开始--#mailbox通信5之PC_M0_M4#的本周任务需求贴,在此基础上扩展了WIFI无线通信。
通信机制:M0核处理流程沿用上贴不变,主要讲下M4核,配置开发板的串口5,连接wifi模块。设置PC端或手机端 为服务器模式,板子上电初始化WiFi模块使WiFi模块为客户端模式,接入局域网,连接PC端或手机端(服务器),并开启透传模式,等待数据。通过网络助手,发送数据给wifi,wifi收到后转发给M4核处理,M4通过mailbox发给M0核,触发M0核中断,数据自加后返回给M4,并打印。
额外测试: 1,按键PB3按下,led7翻转,M4发送数据0xaa到WiFi 2,按键PB4或者PB5按下,led7翻转,M4发送字符串“小马哥的wifi测试”到WiFi
大概流程就是这样喽。。。。。。
先来看下实物图吧
老规矩,先看下测试结果吧(手机连接测试在帖子末尾)
1:服务器ip:192.168.78.100,端口:5000 开发板ip:192.168.78.101,端口:服务器随机分配(16363)
发送数据0x08,左上角抓包抓到服务器发给模块的数据是0x08
发送数据0x08,模块收到后,数据经过M4到M0中,自加1,在发送给M4,通过串口5发送到网络,左上角抓包抓到模块发给服务器的数据是0x09
网络助手发送0x08,收到0x09
串口0 也收到了相关打印信息,验证ok。。。。
2.按下PB2,PB3,PB4,PB5的效果
/////////////////////////////////////////////////////////////////////
逐步解析中。。。。。。。。。。
1.串口篇
这里用到了Arduino 扩展接口 (CN6)的串口引脚(PIO0_18-TX,PIO0_20-RX),为了配置串口5,小马哥还是差了一番手册的,看下图吧。。。
----------------------------------------勘误-------------------------小马哥------------
(勘误:这里纠正下NXP LPC54114开发板用户手册中关于Arduino 扩展接口 (CN6)的串口引脚描述错误(PIO0_20写成了PIO0_21)。
(害的小马哥在这里翻了船,我说文档的小编能不能上点心呢,发现好多错误啦。。。反正我是醉了,除了官方E文文档,别的都不敢想相信了,)
人说无图无真相,好吧,那我就上图指出来吧
好了出问题时候多看下手册,小船还是能浮起来的,车到山前必有路嘛。。。。。。。
------------------------------------------勘误---------------------------小马哥------------
下面说下串口5相关的吧(文档都截出来了,不用小马哥翻译了吧。。。o(╯□╰)o)
PIO0_18----TX
PIO0_20----RX
PCB部分解析
手册引脚部分解析
手册寄存器部分解析
///////////////到此为止,准备工作已经完成了,下面就是串口5 的配置啦///////////////////
先定义串口相关的宏吧
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- #define LPC_USART USART5
- #define LPC_USART_CLK_SRC kCLOCK_Flexcomm5
- #define LPC_USART_CLK_FREQ CLOCK_GetFreq(kCLOCK_Flexcomm5)
- #define LPC_USART_IRQHandler FLEXCOMM5_IRQHandler
- #define LPC_USART_IRQn FLEXCOMM5_IRQn
- #define BOARD_UART5_CLK_ATTACH kFRO12M_to_FLEXCOMM5
- #define BOARD_UART5_RST kFC5_RST_SHIFT_RSTn
- #define BOARD_UART5_BAUDRATE 115200
- /*! @brief Ring buffer size (Unit: Byte). */
- #define LPC_RING_BUFFER_SIZE 16
- #define PIN18_IDX 18u /*!< Pin number for pin 0 in a port 0 */
- #define PIN20_IDX 20u /*!< Pin number for pin 1 in a port 0 */
- #define PORT0_IDX 0u /*!< Port index */
复制代码
初始化gpiio:
- void USART5_InitPins(void)
- {
- /* enable clock for IOCON */
- CLOCK_EnableClock(kCLOCK_Iocon);
- /* USART5 RX/TX pin */
- IOCON_PinMuxSet(IOCON, PORT0_IDX, PIN20_IDX, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);//RX
- IOCON_PinMuxSet(IOCON, PORT0_IDX, PIN18_IDX, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);//TX
- }
复制代码 开启串口5时钟,attach 12 MHz clock to FLEXCOMM5 ,并复位串口5- /* attach 12 MHz clock to FLEXCOMM5 */
- CLOCK_AttachClk(BOARD_UART5_CLK_ATTACH);
- /* reset FLEXCOMM for USART5 */
- RESET_PeripheralReset(BOARD_UART5_RST);
复制代码
配置串口:115200, 8, n, 1 ,完成初始化。
- USART_GetDefaultConfig(&config);
- config.baudRate_Bps = BOARD_UART5_BAUDRATE;
- config.enableTx = true;
- config.enableRx = true;
- USART_Init(LPC_USART, &config, LPC_USART_CLK_FREQ);
复制代码 开中断
- USART_EnableInterrupts(LPC_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
-
- EnableIRQ(LPC_USART_IRQn);
复制代码 接收中断函数
- uint8_t led_blind=0;
- uint8_t wifi_data=0;
- void LPC_USART_IRQHandler(void)
- {
- uint8_t data;
- /* If new data arrived. */
- if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(LPC_USART))
- {
- data = USART_ReadByte(LPC_USART);
- /* If ring buffer is not full, add data to ring buffer. */
- if (((usart_rxIndex + 1) % LPC_RING_BUFFER_SIZE) != usart_txIndex)
- {
- usartRingBuffer[usart_rxIndex] = data;
- usart_rxIndex++;
- usart_rxIndex %= LPC_RING_BUFFER_SIZE;
- }
-
- led_blind=1;
- wifi_data=data;
-
-
- }
- }
复制代码 然后在主函数中初始化串口5 就可以了。。。
2.wifi篇
这里用到了ESP8266串口转wifi模块,只需要按照手册完成曾一系列初始化就可以了,系统上的初始化时通过串口5给WiFi模块发送一系列指令即可。
本次测试配置wiif 模块为客户端,pc为服务器,服务器打开端口5000,侦听客户端的连接请求。
大致流程如下:
上电;
复位wifi模块(AT+RST);
等待复位完,应答信号(ready);
设置wifi的工作模式:AP+Station(AT+CWMODE=3);
等待应答信号(ok);
入网(AT+CWJAP="ssid","password");
等待应答信号(ok);
设置单连接模式(AT+CIPMUX=0);因为我们只需要链接一个服务器,并且透传模式必须限定为单连接
等待应答信号(ok);
连接TCP服务器(AT+CIPSTART="TCP","192.168.78.100",5000);
等待应答信号(ok);
开启透传模式(AT+CIPMODE=1)
等待应答信号(ok);
进入透传(AT+CIPSEND);
等待数据。。。。
到此为止wifi模式已经初始化完成。ps:网络小白的同学们找度娘自行脑补吧,这里就不跑题了。
3.测试篇
(1)服务器(数据发送)---M4(USART5)---M0(data++)---M4(打印)---服务器(数据返回)
到这里,开发板已经连接上了服务器,建立了TCP连接,就等待数据来临了。。。
建立好的链接是酱紫的》
服务器: IP:192.168.78.100 PORT: 5000
客户端: IP:192.168.78.101 PORT: 16363
注:这个客户端的IP 是模块加入局域网后,路由器自动分配的,port是链接服务器后,服务器随机分配的
当服务器发送数据的时候,触发串口5的接收中断,(看上面的接收中断函数),标志位led_blind置位,数据传给wifi_data,在主循环中扫描这个标志位即可。
然后打印数据,并通过mailbox 发送给M0核
- if(led_blind==1)
- {
- led_blind = 0;
- LED7_TOGGLE();
-
- PRINTF("-小马哥-Receive the data from WIFI : %d\r\n", wifi_data);
- PRINTF("-Send Data %d t0 M0-\n", wifi_data);
- PRINTF("\r\n-------------------------------------------\r\n");
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, wifi_data);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
复制代码
M0核收到数据,自加1,再发给M4核,触发M4的mailbox中断函数,打印数据到串口,并把数据发送给wifi模块,传到服务器端。
- void MAILBOX_IRQHandler()
- {
- g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
-
- rxIndex = HexToChar(g_msg,demoRingBuffer);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- PRINTF("M4 Send the data %d to WIFI .\r\n", g_msg);
- USART_WriteByte(LPC_USART, g_msg);
- PRINTF("\r\n---------------------------------------------------------\r\n\r\n");
-
- }
复制代码 (2)按键按下(PB2)-M4(mailbox)----M0(data++)---M4(打印)---服务器(数据返回)
- if(1== key_M)
- {
- key_M=0;
- PRINTF("Press Button :PB2(M4) \n");
- led7_flg ^=1;
- PRINTF("----M4 SEND DATA TO M0 BY BUTTON PB2----\r\n\r\n");
- if(led7_flg==1 )
- {
- LED7_OFF();
- PRINTF("M4:LED7****ON****\r\n\r\n");
- }
- else
- {
- LED7_ON();
- PRINTF("M4:LED7****OFF****\r\n\r\n");
- }
- PRINTF("-СÂí¸ç-Rress PB2 Send Data to M0 : %d\n", g_msg);
-
- MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
- MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
- }
复制代码 效果图
(3)按键按下(PB3/PB4/PB5)-M4(USART5)---服务器(打印)
- if(2== key_M)
- {
- key_M=0;
- PRINTF("-小马哥-Rress PB3 Send Data to wifi ,请在服务器上查看 \n");
- USART_WriteByte(LPC_USART, 0xaa);
- LED7_TOGGLE();
- }
- if((3== key_M) ||(4== key_M))
- {
- key_M=0;
- PRINTF("-小马哥-Rress PB4/PB5 Send String to wifi ,请在服务器上查看 \n");
- AT_Send("小马哥的wifi测试\r\n");
- LED7_TOGGLE();
- }
复制代码
到此为止,基本上就讲完了,,,
发现写帖子比写代码累多了,周末就这样过去啦,,,痛并快乐着。。。。。
新增补充:手机端测试
ps:手机端软件不太好找,中文显示乱码等,如改了下发送字符串为英文的。
代码:
- if(2== key_M)
- {
- key_M=0;
- PRINTF("-小马哥-Rress PB3 Send Data to wifi ,ÇëÔÚ·þÎñÆ÷Éϲ鿴 \n");
- USART_WriteByte(LPC_USART, 0xaa);
- AT_Send("185");
- LED7_TOGGLE();
- }
- if((3== key_M) ||(4== key_M))
- {
- key_M=0;
- PRINTF("-小马哥-Rress PB4/PB5 Send String to wifi £¬ÇëÔÚ·þÎñÆ÷Éϲ鿴 \n");
- AT_Send("WIFI test by XMG\r\n");
- LED7_TOGGLE();
- }
复制代码 1.通过手机服务端发送数据 5 给lpc54114,经WIFI 转M4核,发给M0核,自加一后在返给M4核,再通过wifi传给手机;
2.按下PB3,发送字符串 185 到手机;
3.按下PB4/PB5,发送字符串 WIFI test by XMG 到手机;
直接看图吧
亲们看了觉得有帮助的话,多多支持哦
-----------------------小马哥系列之【LPC54114双核任务二】传送门--------------------
【LPC54114双核任务二】双核之从零开始--#KEIL工程建立配置#
【LPC54114双核任务二】双核之从零开始--#HelloWorld双核调试#
【LPC54114双核任务二】双核之从零开始--#MDK生成BIN#
【LPC54114双核任务二】双核之从零开始--#mailbox通信1之中断#
【LPC54114双核任务二】双核之从零开始--#mailbox通信2之mutex#
【LPC54114双核任务二】双核之从零开始--#mailbox通信3之按键#
【LPC54114双核任务二】双核之从零开始--#mailbox通信4之PC_M4_M0#
【LPC54114双核任务二】双核之从零开始--#mailbox通信5之PC_M0_M4#
【LPC54114双核任务二】双核之从零开始--#mailbox通信6之WIFI_M4_M0#
【LPC54114双核任务二】已完结,小马哥出品,谢谢大家支持。。。。
-----------------------小马哥系列之【LPC54114双核任务二】传送门--------------------
|