【沁恒RISC-V内核 CH582】5-SPI驱动OLED
[复制链接]
本帖最后由 manhuami2007 于 2022-3-13 20:20 编辑
CH582提供的SPI支持模式0和模式3,可以配置为3线或者2线模式,支持主机和从机模式,支持DMA。SPI还支持FIFO,相当于有8个数据寄存器,在小数量数据收发的时候,即使是用轮询方式,也能提高CPU的效率。官方提供的SPI的库函数用起来还是挺方便的。
这次使用的OLED是用的SPI接口,引脚分别用的:
- MOSI - PA14
- CLK - PA13
- CS - PA12
- RES - PA3
- DC - PA1
在移植OLED驱动的时候,其实只需要修改3个函数:
- 外设的初始化
- 数据字节发送
- 命令字节的发送
外设的初始化
void oled_spi_init()
{
GPIOA_SetBits( GPIO_Pin_12 );
GPIOA_ModeCfg( GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA );
SPI0_MasterDefInit();
GPIOA_ModeCfg(GPIO_Pin_1|GPIO_Pin_3,GPIO_ModeOut_PP_5mA);
GPIOA_SetBits( GPIO_Pin_1 );
GPIOA_SetBits( GPIO_Pin_3 );
}
数据和命令字节的发送
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
uint8_t i;
if(cmd)
GPIOA_SetBits(OLED_DC_PIN);
else
GPIOA_ResetBits(OLED_DC_PIN);
GPIOA_ResetBits(OLED_CS_PIN);
SPI0_MasterSendByte( dat );
GPIOA_SetBits(OLED_DC_PIN);
}
void OLED_Write_Multi_Data(uint8_t* data,uint16_t len)
{
uint16_t i;
GPIOA_SetBits(OLED_DC_PIN);
GPIOA_ResetBits(OLED_CS_PIN);
SPI0_MasterTrans( data, len );
GPIOA_SetBits(OLED_CS_PIN);
}
void OLED_Write_Multi_Cmd(uint8_t* data,uint16_t len)
{
uint16_t i;
GPIOA_ResetBits(OLED_DC_PIN);
GPIOA_ResetBits(OLED_CS_PIN);
SPI0_MasterTrans( data, len );
GPIOA_SetBits(OLED_CS_PIN);
GPIOA_SetBits(OLED_DC_PIN);
}
显示图片
|