回答

收藏

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

泰凌微电子 泰凌微电子 1733 人阅读 | 0 人回复 | 2022-11-05

前两天做了一个点灯的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);
复制代码
其中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,随便找个地方放一下就好。这样初始化就好了。
接下来发一下数据,测试一下SPI时候不是好的,我在初始化后加了SPI发送的函数
  1. spi_master_write(PSPI_MODULE, &data[0], sizeof(data));
  2. uint8_t data[5] = {0xAA, 0xBB, 0xCC, 0xDD,0xEE};
复制代码
编译,烧录代码,用逻辑分析仪抓一下波形
很好,数据正确,频率也是我设置的4M,还自动拉了CS脚,不用我自己手动去拉。 SPI跑通了,接下来就是移植驱动,我把Application整个文件夹移动到SDK中
因为移植调试做了太多的修改我已经无法详细记录了,这里略过,我会把代码放在附件里,有兴趣的可以下载下来看看,主要修改的内容就是在applicatin文件夹中然后初始化的地方还要加上所使用的三个GPIO的初始化
  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函数中加一下测试函数,点一下屏
  1. /* 初始化墨水屏 */
  2. E2213JS0C1_Init(0);
  3. /* 显示测试 */
  4. E2213JS0C1_ClearFullScreen(RED);
  5. E2213JS0C1_RefreshScreen();
复制代码
成功点屏!
屏幕已经准备就绪,下一步就是获取手机发来的数据,解析,然后显示到屏幕上。首先定义一个标志位和一个数组。分别用来控制是否刷新和保存显示字符的内容
  1. uint8_t ElinkScreenRefreshFlag;
  2. uint8_t ElinkShowASCII[20];
复制代码
在初始化的时候把他俩清空
  1. ElinkScreenRefreshFlag = 0;
  2.         memset(ElinkShowASCII, 0, sizeof(ElinkShowASCII));
复制代码
然后在mainloop中加入显示的代码
  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.         }
复制代码
最后一步就是去获取蓝牙数据
  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)

demo演示视频:


分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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