[RTT&瑞萨高性能 CPK-RA6M4] 5、软件模拟I2C驱动OLED评测
<div class='showpostmsg'><p>一、硬件部分</p><p>1、管脚资源</p>
<p>由于用的是纯软件模拟,所以引脚方面没什么特别要求,因此还是用的上个评测项目的连线方式</p>
<p><a href="https://bbs.eeworld.com.cn/thread-1205578-1-1.html" target="_blank"> 4、SPI驱动OLED评测</a></p>
<p><img src="https://bbs.eeworld.com.cn/data/attachment/forum/202206/02/094221vgcyqququyy5o06y.png.thumb.jpg" /></p>
<p>2、I2C时序</p>
<p>由于要使用I2C进行传输,因此需要对I2C的时序等有了解</p>
<p> I2C传输过程中,数据只能在SCL低电平期间发生改变,因此在软件模拟时,要符合I2C的时序要求</p>
<p>二、软件部分</p>
<p>1、RTT Settings</p>
<p>由于需要软件模拟I2C,因此在RTT Settings中,需要简单的设置一些参数,使能I2CBus,并设置相应的管脚Pin。事实上,只需要管脚的宏定义就可以了</p>
<p> </p>
<p>2、FSP配置</p>
<p>瑞萨的smart configurator中不需要额外的设置的,使用最基础的的配置就可以了,就是GPIO和串口7的配置,另外,如需要呼吸灯,加上PWM等</p>
<p> 3、代码说明</p>
<p>由于驱动的是同一块OLED,所以,只修改了驱动方式中的数据传输,前一个项目用的是SPI,本次项目只需要模拟I2C就可以了,所以代码部分的更改不多</p>
<pre>
<code>#define OLED_SCL_0rt_pin_write(BSP_I2C1_SCL_PIN, PIN_LOW);
#define OLED_SCL_1rt_pin_write(BSP_I2C1_SCL_PIN, PIN_HIGH);
#define OLED_SDA_0rt_pin_write(BSP_I2C1_SDA_PIN, PIN_LOW);
#define OLED_SDA_1rt_pin_write(BSP_I2C1_SDA_PIN, PIN_HIGH);
void oled_i2c_write( rt_uint8_t Data)
{
rt_uint8_t i = 0;
OLED_SCL_0;
for(i = 0;i < 8;i++)
{
OLED_SCL_0;
if (Data & 0x80)
{
OLED_SDA_1;
}
else
{
OLED_SDA_0;
}
OLED_SCL_1;
Data <<= 1;
}
}</code></pre>
<p>另外,就是初始化部分有一些区别了,毕竟SPI和I2C的初始化不同</p>
<pre>
<code>int OLED_Pin_Init(void)//IO初始化
{
// char user_data[] = {1};
// if (rt_spi_bus_attach_device(&spi_dev_oled, "oled", "spi1", user_data) != RT_EOK)
// return -RT_ERROR;
//
// /* config spi */
// {
// struct rt_spi_configuration cfg;
// cfg.data_width = 8;
// cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
// cfg.max_hz = 5 * 1000 * 1000; /* 42M,SPI max 42MHz,lcd 4-wire spi */
//
// rt_spi_configure(&spi_dev_oled, &cfg);
// }
rt_pin_mode(BSP_I2C1_SCL_PIN,PIN_MODE_OUTPUT);
rt_pin_mode(BSP_I2C1_SDA_PIN,PIN_MODE_OUTPUT);
rt_pin_mode(OLED_RST_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(OLED_DC_PIN,PIN_MODE_OUTPUT);
rt_pin_mode(OLED_CS_PIN,PIN_MODE_OUTPUT);
return RT_EOK;
}</code></pre>
<p>4、演示视频</p>
<p>271163b9f9280f56e619e23e436c4b22<br />
三、心得体会</p>
<p>在使用I2C的过程,参考了很多例程,但是在实际使用的时候,还是使用原来在其他芯片上使用的软件模拟I2C实现的,这个模拟是从时序开始的,但是在传输逻辑中,没有考虑应答这些,好在评测结果还是不错的。因此,感觉和I2C的start、stop、ack、nack等有一定的不同,尤其是I2C地址,因此本次的模拟应该是不完整的,由于在多个设备通讯时。本次评测j结束后,会考虑完整的I2C模拟。</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>多个设备通讯时软件模拟I2C是有点难度的</p>
<p>楼主的测评方法给了启发</p>
页:
[1]