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