1楼演示了使用AiCube生成硬件SPI代码驱动OLED的流程
本楼演示使用AiCube生成 硬件 SPI-DMA 代码驱动OLED的流程
1、使用AiCube生成 SPI-DMA驱动框架
打开AiCube,新建Ai8051U-32Bit项目
1.1、I/O口配置可参考1楼的配置方法
1.2、如下图对SPI功能模块进行配置,与1楼的区别是增加了SPI-DMA的配置
1.3、完成上面的配置生成Keil项目框架及相应的代码
2、完善代码添加OLED驱动代码
2.1、同样将添加OLED驱动代码和数据代码到项目中
2.2、使用硬件SPI-DMA实现OLED的低层驱动代码(核心代码)
-
- ////////////////////////////////////////
- // 写OLED命令
- // 入口参数: cmd (命令序列)
- // len (命令长度)
- // 函数返回: 无
- ////////////////////////////////////////
- void OLED_WR_CMD(uint8_t *cmd, uint16_t len)
- {
- while (fSPIDMABusy); //等待上一次传输完成
-
- OLED_DC = 0; //写命令
- OLED_SendData(cmd, len);
- }
-
- ////////////////////////////////////////
- // 写OLED数据
- // 入口参数: dat (数据序列)
- // len (数据长度)
- // 函数返回: 无
- ////////////////////////////////////////
- void OLED_WR_DAT(uint8_t *dat, uint16_t len)
- {
- while (fSPIDMABusy); //等待上一次传输完成
-
- OLED_DC = 1; //写数据
- OLED_SendData(dat, len);
- }
-
- ////////////////////////////////////////
- // 发送OLED数据
- // 入口参数: dat (数据序列)
- // len (数据长度)
- // 函数返回: 无
- ////////////////////////////////////////
- void OLED_SendData(uint8_t *dat, uint16_t len)
- {
- OLED_CS = 0; //片选使能
-
- memcpy(pu8SPIDMATxBuffer, dat, len); //将数据复制到DMA缓冲区
-
- DMA_SPI_SetAmount(len - 1); //设置DMA发送字节数
- DMA_SPI_MasterTrigger(); //触发SPI主机DMA
- fSPIDMABusy = 1; //设置DMA传输忙标志
- }
复制代码
2.3、其它代码可参考附件中的代码完成
2.4、代码完成代码编写后,将编译生成的HEX文件下载到试验箱,同样也可看到如1楼的效果
|