查看: 814|回复: 0

[评测分享] 【Telink-泰凌微电子 B91通用开发套件】⑧蓝牙墨水屏标签DEMO

[复制链接]
  • TA的每日心情
    开心
    2024-4-25 10:04
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2022-11-5 15:34:43 | 显示全部楼层 |阅读模式
    分享到:
    前两天做了一个点灯的Demo,总想着再玩点别的什么,蓝牙属于低功耗技术,得结合一下他低功耗的场景,突然想到之前我做过一款开源的电子墨水屏的驱动,正好可以用得上(GitHub地址:https://github.com/BUYITAO/My_E-Paper_Driver)。那就做一个用手机控制电子墨水屏显示字符的demo吧,因为时间仓促,也不定什么协议或者GUI设计了,就接收手机给过来的字符编码,然后在墨水屏上显示。
    明确了制作的目标,看一下我还需要去了解哪些外设的使用?驱动墨水屏需要使用SPI、GPIO。GPIO之前点灯的时候就了解了,那就还需要去看一下SPI。因为至今还没有找到这个芯片的技术手册,也不知道他有几个SPI,所以驱动板上外置的flash就不用了,就用一路SPI驱动墨水屏即可。
    偷偷摸摸看一下SPI的Demo,学习一下如何使用SPI。。。。。。
    好了我们开始写代码吧,首先使用的还是上个demo使用的“Bluetooth® LE Generic”这个SDK中的“B91_module”demo。
    在app.c的user_init_normal()中最后面加上SPI初始化的代码
    1. /* SPI初始化 */
    2. spi_master_init(PSPI_MODULE, sys_clk.hclk * 1000000 / (2 * SPI_CLK) - 1, SPI_MODE0);
    3. pspi_set_pin(&pspi_pin_config);
    复制代码
    1.png
    其中SPI_CLK、pspi_pin_config是灰色的,因为这两个需要我们自己设置,第一个参数是SPI的速度,我设置为4M,第二个参数是使用那几个GPIO给SPI用,我就照着SPIdemo的抄
    1. pspi_pin_config_t pspi_pin_config = {
    2. .pspi_clk_pin = PSPI_CLK_PC5,
    3. .pspi_csn_pin = PSPI_CSN_PC4,
    4. .pspi_mosi_io0_pin = PSPI_MOSI_IO0_PC7,
    5. .pspi_miso_io1_pin = PSPI_MISO_IO1_PC6,
    6. };
    7. #define SPI_CLK 400000
    复制代码
    还是放在app.c,随便找个地方放一下就好。这样初始化就好了。
    2.png
    接下来发一下数据,测试一下SPI时候不是好的,我在初始化后加了SPI发送的函数
    1. spi_master_write(PSPI_MODULE, &data[0], sizeof(data));
    2. uint8_t data[5] = {0xAA, 0xBB, 0xCC, 0xDD,0xEE};
    复制代码
    3.png
    编译,烧录代码,用逻辑分析仪抓一下波形 4.jpg
    5.png
    6.png
    很好,数据正确,频率也是我设置的4M,还自动拉了CS脚,不用我自己手动去拉。 SPI跑通了,接下来就是移植驱动,我把Application整个文件夹移动到SDK中 7.png
    因为移植调试做了太多的修改我已经无法详细记录了,这里略过,我会把代码放在附件里,有兴趣的可以下载下来看看,主要修改的内容就是在applicatin文件夹中然后初始化的地方还要加上所使用的三个GPIO的初始化 8.png
    1. /* 初始化墨水屏用到的三个GPIO */
    2. gpio_set_gpio_en(GPIO_PE2);
    3. gpio_set_input_en(GPIO_PE2, 1);
    4. gpio_set_output_en(GPIO_PE0, 1);
    5. gpio_set_output_en(GPIO_PE1, 1);
    复制代码
    在mian函数中加一下测试函数,点一下屏 9.png
    1. /* 初始化墨水屏 */
    2. E2213JS0C1_Init(0);
    3. /* 显示测试 */
    4. E2213JS0C1_ClearFullScreen(RED);
    5. E2213JS0C1_RefreshScreen();
    复制代码
    成功点屏! 10.jpg
    屏幕已经准备就绪,下一步就是获取手机发来的数据,解析,然后显示到屏幕上。首先定义一个标志位和一个数组。分别用来控制是否刷新和保存显示字符的内容 11.png
    1. uint8_t ElinkScreenRefreshFlag;
    2. uint8_t ElinkShowASCII[20];
    复制代码
    在初始化的时候把他俩清空
    12.png
    1. ElinkScreenRefreshFlag = 0;
    2.         memset(ElinkShowASCII, 0, sizeof(ElinkShowASCII));
    复制代码
    然后在mainloop中加入显示的代码
    13.png
    1. /* 电子墨水屏刷新 */
    2.         if (ElinkScreenRefreshFlag == 1)
    3.         {
    4.                 E2213JS0C1_ClearFullScreen(WHITE);
    5.                 E2213JS0C1_ShowCharStr(0, 50, BLACK, WHITE, FONT_1608, &ElinkShowASCII[0]);
    6.                 E2213JS0C1_RefreshScreen();
    7.                 /* 清除标志位、以及缓存的数据 */
    8.                 ElinkScreenRefreshFlag = 0;
    9.                 memset(ElinkShowASCII, 0, sizeof(ElinkShowASCII));
    10.         }
    复制代码
    最后一步就是去获取蓝牙数据
    14.png
    1. extern uint8_t ElinkScreenRefreshFlag;
    2. extern uint8_t ElinkShowASCII[20];
    复制代码
    1. /* 获取手机->B91的数据,并允许屏幕刷新 */
    2.                 if (ElinkScreenRefreshFlag == 0)
    3.                 {
    4.                         ElinkScreenRefreshFlag = 1;
    5.                         memcpy(&ElinkShowASCII[0], &p->opcode + 1, len);
    6.                 }
    复制代码
    这样就OK了,因为中途调试修改了很久,步骤中会遗漏include头文件,以及某些语句注释/修改。
    代码我放在附件里了,有兴趣朋友可以下下来看看
    B91_ble_sdk.rar (8.74 MB, 下载次数: 18)
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 22:40 , Processed in 0.128285 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.