| 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的底层驱动代码(核心代码)
 
 2.3、其它代码可参考附件中的代码完成复制代码
////////////////////////////////////////
// 写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.4、代码完成代码编写后,将编译生成的HEX文件下载到试验箱,同样也可看到如1楼的效果
 
 
 
 
 |