【沁恒RISC-V内核 CH582】5-SPI驱动OLED
本帖最后由 manhuami2007 于 2022-3-13 20:20 编辑<div class="parsedown-markdown">
<p>CH582提供的SPI支持模式0和模式3,可以配置为3线或者2线模式,支持主机和从机模式,支持DMA。SPI还支持FIFO,相当于有8个数据寄存器,在小数量数据收发的时候,即使是用轮询方式,也能提高CPU的效率。官方提供的SPI的库函数用起来还是挺方便的。</p>
<p>这次使用的OLED是用的SPI接口,引脚分别用的:</p>
<ul>
<li>MOSI - PA14</li>
<li>CLK - PA13</li>
<li>CS - PA12</li>
<li>RES - PA3</li>
<li>DC - PA1</li>
</ul>
<p>在移植OLED驱动的时候,其实只需要修改3个函数:</p>
<ol>
<li>外设的初始化</li>
<li>数据字节发送</li>
<li>命令字节的发送</li>
</ol>
<h4>外设的初始化</h4>
<pre>
<code class="language-c">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 );
}</code></pre>
<h4>数据和命令字节的发送</h4>
<pre>
<code class="language-c">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);
}</code></pre>
<h4>显示图片</h4>
<p><img alt="" src="2022-03-12-20-43-25.png" target="_blank" /></p>
</div>
<p> </p>
页:
[1]