本帖最后由 强仔00001 于 2015-9-10 17:02 编辑
上次弄完了系统时钟部分,今天就像弄个OLED
上去来显示一些数据。我的OLED
屏幕的数据传输协议是SPI
,论坛上也有分享了一个程序,但也只是用IO
模拟的SPI
时序而已。今天我带来的硬件的SPI
驱动OLED
,传输速率可以去到10MHz
,大大的提升了传输速度和解放了一下CPU
,让CPU
可以有更多的时间去处理别的任务。闲话少说,马上进入我的讲解。 首先我这个是基于官方的一个历程修改的。官方历程的底层是不能直接驱动OLED的,因为历程是作为从发送接受。所以要自己动手修改一些配置,把它改成主发送接受。这就要参考下瑞萨的硬件手册的内容了。
我们来看看瑞莎的CSI
的一些特性,SPI
就是CSI
我们在看寄存器时只需要关注这几个寄存器即可:
这个是开启CSI时钟使能部分的,这个就相当于一个总开关。
接下来就是公共运行时钟的选择,分别有CK00和CK01,还有如果要改成主模式的,还要配置通道的传送时钟( fTCLK)选择的寄存器如下手册的截图:
可以看出我们只需配置SMR00H的CKSO0和CCSO0位就可以搞定CSI0模块的时钟源部分。
还有注意下SMR寄存器的某些位一定要配置成某些值,如下手册的说明:
接下来就是模式选择的部分,这里可以配置成CSI模式和UART模式。
当配置完了模式后,我们还要配置是否发送和接受,这里要具体看大家的需求而改:
接下来我们还要配置CSI的数据传输模式,根据数据和时钟的相位的组合,有4种模式可以配置,这里就需要根据自己要通信的芯片的技术文档所提供的模式要选择这四种模式之一来工作。大家可以看这个表就可以配置自己所需要的数据传输模式。
接着下来配置两个个使能开关,这是通信开始所需的。
关于时钟源这里还多说几句,大家想了解清楚,可以看看手册的一个框图:
由这几个框图可以看出时钟源是经过了3级选择器和2级预分频器产生的,先关的寄存器图上也有注明,大家可以去查阅。
还有关于IO口设置这里需要大家配置,这个手册上也有详细的说明:
这个是设置成输出或者输入模式的说明,官方手册上已经说明的很清楚。接下来就是分享关键的程序的部分了:
至关重要的SPI初始化部分:
- void R_CSI00_Create(void)
- {
- ST0 |= 0x01U; /* 关闭 CSI00 */
- CSIMK00 = 1U; /* 关闭 INTCSI00 中断 */
- CSIIF00 = 0U; /* 清除 INTCSI00 中断标志位 */
- /* 设置 INTCSI00 为低优先级*/
- CSIPR100 = 1U;
- CSIPR000 = 1U;
- SIR00 = 0x03U; /* clear error flag */
- SMR00H = 0x00U; //配置CSI00的时钟源为CK00,CKS00 由运行时钟 fMCK 的分频时钟提供
- SMR00L = 0x20U; //配置为CSI模式
- SCR00H = 0xC0U; //使能CSI的接受和发送,传输数据模式为类型1
- SCR00L = 0x07U; //配置为CSI为传输数据传送顺序的选择为MSB 优先的输入 / 输出,数据长度为8bit
- SDR00H = 0x00U; //配置CSI时钟2分频
- SDR00L = 0x00U;
- SO0 &= (uint8_t)~0x01U; /* 初始化SO电平为低电平 */
- SOE0 |= 0x01U; /* 使能 CSI00 输出 */
- /* 配置 SI00 脚为输入模式 */
- PMC0 &= 0x7FU;
- PM0 |= 0x80U;
- /* 配置 SO00 脚为输出模式 */
- P0 |= 0x40U;
- PM0 &= 0xBFU;
- /* 配置 SCK00 脚为输出模式 */
- PMC1 &= 0xFEU;
- PM1 &= 0xFEU;
- P1 |= 0x01U;
-
- }
复制代码这里已经有注释了。
大家如果想使用中断时,就把使能和关闭中断的部分代码去掉注释即可,我这里每次传输的一个8bit,所以我就不用中断发,把程序改成了非中断的。
以下是发送的代码:
- <blockquote>MD_STATUS R_CSI00_Send_Receive(uint8_t *txbuf, uint16_t txnum, uint8_t *rxbuf)
复制代码OLED的驱动部分是用了网友的,把发送函数集成到里面。
上几张成果图:
这个是用示波器测的CLK时钟速率,实测最大能到10M
上git图,刷得挺快的。 源代码分享:
OLED.zip
(162.4 KB, 下载次数: 46, 售价: 1 分芯积分)
OLED.zip
(162.4 KB, 下载次数: 46, 售价: 1 分芯积分)