kit7828 发表于 2022-6-8 20:19

[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>&nbsp;&nbsp;I2C传输过程中,数据只能在SCL低电平期间发生改变,因此在软件模拟时,要符合I2C的时序要求</p>

<p>二、软件部分</p>

<p>1、RTT Settings</p>

<p>由于需要软件模拟I2C,因此在RTT Settings中,需要简单的设置一些参数,使能I2CBus,并设置相应的管脚Pin。事实上,只需要管脚的宏定义就可以了</p>

<p> &nbsp;</p>

<p>2、FSP配置</p>

<p>瑞萨的smart configurator中不需要额外的设置的,使用最基础的的配置就可以了,就是GPIO和串口7的配置,另外,如需要呼吸灯,加上PWM等</p>

<p> &nbsp;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 &lt; 8;i++)
    {
      OLED_SCL_0;
      if (Data &amp; 0x80)
      {
            OLED_SDA_1;
      }
      else
      {
            OLED_SDA_0;
      }
      OLED_SCL_1;
      Data &lt;&lt;= 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(&amp;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(&amp;spi_dev_oled, &amp;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>

Jacktang 发表于 2022-6-10 06:44

<p>多个设备通讯时软件模拟I2C是有点难度的</p>

<p>楼主的测评方法给了启发</p>
页: [1]
查看完整版本: [RTT&瑞萨高性能 CPK-RA6M4] 5、软件模拟I2C驱动OLED评测