AT085 MCU SPI

[复制链接]
833|6
 楼主| zlcn 发表于 2023-7-27 15:06 | 显示全部楼层 |阅读模式
使用AT085 MCU驱动增加SPI外设,驱动OLED屏幕;SPI端口无硬件FIFO,写入命令及数据到OLED模块时,每次写入都需要等待SPI发送完成,并清除标志位;软件上等待SPI完成发送使用了while循环等待发送完成,当对OLED模块写入图片数据时,while循环等待的时间严重占用了MCU资源,甚至定时任务调度函数时间均受到影响,请问下有没有好的思路可以避免MCU资源消耗问题
lz34 发表于 2023-7-29 11:55 | 显示全部楼层
别死等啊,用查询就好了,或者么改dma
鸥芯电驱港港 发表于 2023-7-31 09:20 | 显示全部楼层
1、是的,可以在mian函数内部轮询读取SPI发送完成标志后,再发送下一字节。
2、使用DMA方式多字节硬件搬运发送数据,这样占用MCU资源少。

评论

使用CAN通信功能时,推荐使用外部时钟参考;请问能不能使用外部时钟作为CAN参考时钟,内部PLL时钟还是使用内部晶振的方式  发表于 2023-8-3 19:55
caigang13 发表于 2023-8-2 07:24 来自手机 | 显示全部楼层
有没有DMA,用DMA能够大大减少CPU资源的消耗。
 楼主| zlcn 发表于 2023-8-2 08:20 | 显示全部楼层
lz34 发表于 2023-7-29 11:55
别死等啊,用查询就好了,或者么改dma

是的,有改用查询方式,但是改了之后OLED底层驱动可能受到影响,不能正常显示
 楼主| zlcn 发表于 2023-8-2 08:30 | 显示全部楼层
void OLED_Write_Cmd(u8 data)
{
          OLED_DC_Clr();
       
          SPI_SIZE  = 1;
          //SPI_SendData(SPI,data);       
       
         SPI_TX_DATA = data;
       
    while (!(SPI_IE & BIT2))
    {
    };         
               
    SPI_IE |= BIT2;      //清除SPI传输完成标志位       
}

void OLED_Write_Data(u8 data)
{
          OLED_DC_Set();
       
          SPI_SIZE  = 1;
          //SPI_SendData(SPI,data);       
       
          SPI_TX_DATA = data;
       
    while (!(SPI_IE & BIT2))
    {
                       
    };         
       
    SPI_IE |= BIT2;      //清除SPI传输完成标志位       
               
}


上面两个函数是OLED屏幕的两个SPI底层驱动函数,操作屏幕显示时,需要先写入Cmd命令指定显示位置,再写入数据,有尝试将SPI标志位改用查询方式清除,但是可能是影响到操作时序,底层驱动失效,OLED不显示;

改用DMA模式,也是只能每次写入单字节数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

147

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部