查看: 10218|回复: 15

[原创] 【LPC54114双核任务二】双核之从零开始--#mailbox通信6之WIFI_M4_M0

[复制链接]
  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9327
    最后登录
    2022-5-12
    发表于 2017-7-2 09:22:44 | 显示全部楼层 |阅读模式
    本帖最后由 小马哥-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



    大概流程就是这样喽。。。。。。

    先来看下实物图吧

    111.png

    老规矩,先看下测试结果吧(手机连接测试在帖子末尾
    1:服务器ip:192.168.78.100,端口:5000    开发板ip:192.168.78.101,端口:服务器随机分配(16363)

    发送数据0x08,左上角抓包抓到服务器发给模块的数据是0x08

    222.png


    发送数据0x08,模块收到后,数据经过M4到M0中,自加1,在发送给M4,通过串口5发送到网络,左上角抓包抓到模块发给服务器的数据是0x09
    333.png

    网络助手发送0x08,收到0x09

    串口0 也收到了相关打印信息,验证ok。。。。

    2.按下PB2,PB3,PB4,PB5的效果
    66.png

    777.png

    /////////////////////////////////////////////////////////////////////
    逐步解析中。。。。。。。。。。

    1.串口篇
    这里用到了Arduino 扩展接口 (CN6)的串口引脚(PIO0_18-TX,PIO0_20-RX),为了配置串口5,小马哥还是差了一番手册的,看下图吧。。。
    ----------------------------------------勘误-------------------------小马哥------------
    勘误:这里纠正下NXP LPC54114开发板用户手册中关于Arduino 扩展接口 (CN6)的串口引脚描述错误(PIO0_20写成了PIO0_21)。
    害的小马哥在这里翻了船,我说文档的小编能不能上点心呢,发现好多错误啦。。。反正我是醉了,除了官方E文文档,别的都不敢想相信了,
    人说无图无真相,好吧,那我就上图指出来吧
    8.png

    好了出问题时候多看下手册,小船还是能浮起来的,车到山前必有路嘛。。。。。。。
    ------------------------------------------勘误---------------------------小马哥------------
    下面说下串口5相关的吧(文档都截出来了,不用小马哥翻译了吧。。。o(╯□╰)o)
    PIO0_18----TX
    PIO0_20----RX


    PCB部分解析
    q.png

    w.png

    e.png
    手册引脚部分解析
    a.png

    b.png

    手册寄存器部分解析


    c.png

    d.png
    ///////////////到此为止,准备工作已经完成了,下面就是串口5 的配置啦///////////////////


    先定义串口相关的宏吧
    1. /*******************************************************************************
    2. * Definitions
    3. ******************************************************************************/
    4. #define LPC_USART                                                 USART5
    5. #define LPC_USART_CLK_SRC                 kCLOCK_Flexcomm5
    6. #define LPC_USART_CLK_FREQ                 CLOCK_GetFreq(kCLOCK_Flexcomm5)
    7. #define LPC_USART_IRQHandler         FLEXCOMM5_IRQHandler
    8. #define LPC_USART_IRQn                                 FLEXCOMM5_IRQn

    9. #define BOARD_UART5_CLK_ATTACH         kFRO12M_to_FLEXCOMM5
    10. #define BOARD_UART5_RST                                        kFC5_RST_SHIFT_RSTn

    11. #define BOARD_UART5_BAUDRATE                115200
    12. /*! @brief Ring buffer size (Unit: Byte). */
    13. #define LPC_RING_BUFFER_SIZE         16


    14. #define PIN18_IDX                         18u   /*!< Pin number for pin 0 in a port 0 */
    15. #define PIN20_IDX                         20u   /*!< Pin number for pin 1 in a port 0 */
    16. #define PORT0_IDX                         0u   /*!< Port index */
    复制代码


    初始化gpiio:
    1. void USART5_InitPins(void)
    2. {
    3.     /* enable clock for IOCON */
    4.     CLOCK_EnableClock(kCLOCK_Iocon);

    5.     /* USART5 RX/TX pin */
    6.     IOCON_PinMuxSet(IOCON, PORT0_IDX, PIN20_IDX, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);//RX
    7.     IOCON_PinMuxSet(IOCON, PORT0_IDX, PIN18_IDX, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);//TX
    8. }
    复制代码
    开启串口5时钟,attach 12 MHz clock to FLEXCOMM5 ,并复位串口5
    1.   /* attach 12 MHz clock to FLEXCOMM5  */
    2.     CLOCK_AttachClk(BOARD_UART5_CLK_ATTACH);

    3.     /* reset FLEXCOMM for USART5 */
    4.     RESET_PeripheralReset(BOARD_UART5_RST);
    复制代码

    配置串口:115200,  8,  n,   1 ,完成初始化。

    1. USART_GetDefaultConfig(&config);
    2.     config.baudRate_Bps = BOARD_UART5_BAUDRATE;
    3.     config.enableTx = true;
    4.     config.enableRx = true;

    5.     USART_Init(LPC_USART, &config, LPC_USART_CLK_FREQ);
    复制代码
    开中断
    1. USART_EnableInterrupts(LPC_USART, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
    2.                
    3.     EnableIRQ(LPC_USART_IRQn);

    复制代码
    接收中断函数
    1. uint8_t led_blind=0;
    2. uint8_t wifi_data=0;
    3. void LPC_USART_IRQHandler(void)
    4. {
    5.     uint8_t data;

    6.     /* If new data arrived. */
    7.     if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(LPC_USART))
    8.     {
    9.         data = USART_ReadByte(LPC_USART);
    10.         /* If ring buffer is not full, add data to ring buffer. */
    11.         if (((usart_rxIndex + 1) % LPC_RING_BUFFER_SIZE) != usart_txIndex)
    12.         {
    13.             usartRingBuffer[usart_rxIndex] = data;
    14.             usart_rxIndex++;
    15.             usart_rxIndex %= LPC_RING_BUFFER_SIZE;
    16.         }
    17.                                 
    18.                                 led_blind=1;
    19.                                 wifi_data=data;
    20.                                 
    21.                                 
    22.     }
    23. }
    复制代码
    然后在主函数中初始化串口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是链接服务器后,服务器随机分配的


    222222222222222.png

    当服务器发送数据的时候,触发串口5的接收中断,(看上面的接收中断函数),标志位led_blind置位,数据传给wifi_data,在主循环中扫描这个标志位即可。
    然后打印数据,并通过mailbox 发送给M0核
    1.    if(led_blind==1)
    2.                         {
    3.                         led_blind = 0;
    4.                                 LED7_TOGGLE();
    5.                                 
    6.                                 PRINTF("-小马哥-Receive the data from WIFI : %d\r\n", wifi_data);
    7.                                 PRINTF("-Send Data %d t0 M0-\n", wifi_data);
    8.                                 PRINTF("\r\n-------------------------------------------\r\n");

    9.                                 MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, wifi_data);
    10.                                 MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    11.                         }
    复制代码


    M0核收到数据,自加1,再发给M4核,触发M4的mailbox中断函数,打印数据到串口,并把数据发送给wifi模块,传到服务器端。
    1. void MAILBOX_IRQHandler()
    2. {
    3.     g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
    4.         
    5.         rxIndex = HexToChar(g_msg,demoRingBuffer);

    6.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    7.         PRINTF("M4 Send the data %d to WIFI .\r\n", g_msg);
    8.                 USART_WriteByte(LPC_USART, g_msg);

    9.                                 PRINTF("\r\n---------------------------------------------------------\r\n\r\n");
    10.                                 
    11. }
    复制代码
    (2)按键按下(PB2)-M4(mailbox)----M0(data++)---M4(打印)---服务器(数据返回)
    1. if(1== key_M)
    2.                         {
    3.                                         key_M=0;
    4.                                         PRINTF("Press Button :PB2(M4)  \n");
    5.                                                         led7_flg ^=1;        
    6.                                 PRINTF("----M4  SEND  DATA  TO M0 BY BUTTON PB2----\r\n\r\n");
    7.                                 if(led7_flg==1 )
    8.                                 {
    9.                                         LED7_OFF();
    10.                                         PRINTF("M4:LED7****ON****\r\n\r\n");
    11.                                 }
    12.                                 else
    13.                                 {
    14.                                         LED7_ON();
    15.                                         PRINTF("M4:LED7****OFF****\r\n\r\n");
    16.                                 }
    17.                                 PRINTF("-СÂí¸ç-Rress PB2 Send Data to M0 : %d\n", g_msg);
    18.                                 
    19.                                 MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
    20.                                 MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);

    21.                         }
    复制代码
    效果图

    66666666677.png


    (3)按键按下(PB3/PB4/PB5)-M4(USART5)---服务器(打印)


    1. if(2== key_M)
    2.                         {
    3.                                         key_M=0;
    4.                                 PRINTF("-小马哥-Rress PB3 Send Data to wifi ,请在服务器上查看 \n");
    5.                                 USART_WriteByte(LPC_USART, 0xaa);
    6.                                 LED7_TOGGLE();
    7.                         }
    8.                         if((3== key_M) ||(4== key_M))
    9.                         {
    10.                                         key_M=0;
    11.                                 PRINTF("-小马哥-Rress PB4/PB5 Send String to wifi ,请在服务器上查看 \n");
    12.                                 AT_Send("小马哥的wifi测试\r\n");
    13.                                 LED7_TOGGLE();
    14.                         }
    复制代码


    到此为止,基本上就讲完了,,,
    发现写帖子比写代码累多了,周末就这样过去啦,,,痛并快乐着。。。。。

    新增补充:手机端测试
    ps:手机端软件不太好找,中文显示乱码等,如改了下发送字符串为英文的。
    代码:
    1.      if(2== key_M)
    2.                         {
    3.                                         key_M=0;
    4.                                 PRINTF("-小马哥-Rress PB3 Send Data to wifi ,ÇëÔÚ·þÎñÆ÷Éϲ鿴 \n");
    5. USART_WriteByte(LPC_USART, 0xaa);
    6.                                 AT_Send("185");
    7.                                 LED7_TOGGLE();
    8.                         }
    9.                         if((3== key_M) ||(4== key_M))
    10.                         {
    11.                                         key_M=0;
    12.                                 PRINTF("-小马哥-Rress PB4/PB5 Send String to wifi £¬ÇëÔÚ·þÎñÆ÷Éϲ鿴 \n");
    13.                                 AT_Send("WIFI test by XMG\r\n");
    14.                                 LED7_TOGGLE();
    15.                         }
    复制代码
    1.通过手机服务端发送数据  5  给lpc54114,经WIFI 转M4核,发给M0核,自加一后在返给M4核,再通过wifi传给手机;

    2.按下PB3,发送字符串   185    到手机;

    3.按下PB4/PB5,发送字符串     WIFI test by XMG     到手机;

    直接看图吧
    111111111111111111111.png



    亲们看了觉得有帮助的话,多多支持哦


    -----------------------小马哥系列【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双核任务二】传送门--------------------









    好好
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-7-2 10:34:57 | 显示全部楼层
    学习了,厉害大神
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9327
    最后登录
    2022-5-12
     楼主| 发表于 2017-7-2 11:00:16 | 显示全部楼层
    持续更新中。。。。。。。。。。。。。。。。。。
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-7-3 23:08
  • 签到天数: 57 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    106

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    351
    最后登录
    2018-7-3
    发表于 2017-7-2 12:03:37 | 显示全部楼层
    wifi 都用上了,我的神额
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-3-27 15:23
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    109

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    333
    最后登录
    2018-6-28
    发表于 2017-7-2 13:23:16 | 显示全部楼层
    连载帖   贴贴相扣  学习了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-3-27 15:21
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    93

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    299
    最后登录
    2018-7-3
    发表于 2017-7-2 13:28:28 | 显示全部楼层
    楼主 wifi 模块 性能怎么样啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-7-21 17:51
  • 签到天数: 65 天

    连续签到: 1 天

    [LV.6]常住居民II

    0

    主题

    123

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    448
    最后登录
    2018-8-5
    发表于 2017-7-2 13:35:44 | 显示全部楼层
    学习学习
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9327
    最后登录
    2022-5-12
     楼主| 发表于 2017-7-2 14:12:18 | 显示全部楼层
    lpc_led 发表于 2017-7-2 13:28
    楼主 wifi 模块 性能怎么样啊

    玩玩还是可以的
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-7-9 20:44
  • 签到天数: 42 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    74

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    240
    最后登录
    2018-7-9
    发表于 2017-7-2 18:01:31 | 显示全部楼层
    这个模块我有用过
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9327
    最后登录
    2022-5-12
     楼主| 发表于 2017-7-2 20:23:06 | 显示全部楼层
    好好
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-5 14:45 , Processed in 0.105069 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表