一、硬件部分
1、管脚资源
由于用的是纯软件模拟,所以引脚方面没什么特别要求,因此还是用的上个评测项目的连线方式
[RTT&瑞萨高性能 CPK-RA6M4] 4、SPI驱动OLED评测
2、I2C时序
由于要使用I2C进行传输,因此需要对I2C的时序等有了解
I2C传输过程中,数据只能在SCL低电平期间发生改变,因此在软件模拟时,要符合I2C的时序要求
二、软件部分
1、RTT Settings
由于需要软件模拟I2C,因此在RTT Settings中,需要简单的设置一些参数,使能I2CBus,并设置相应的管脚Pin。事实上,只需要管脚的宏定义就可以了
2、FSP配置
瑞萨的smart configurator中不需要额外的设置的,使用最基础的的配置就可以了,就是GPIO和串口7的配置,另外,如需要呼吸灯,加上PWM等
3、代码说明
由于驱动的是同一块OLED,所以,只修改了驱动方式中的数据传输,前一个项目用的是SPI,本次项目只需要模拟I2C就可以了,所以代码部分的更改不多
#define OLED_SCL_0 rt_pin_write(BSP_I2C1_SCL_PIN, PIN_LOW);
#define OLED_SCL_1 rt_pin_write(BSP_I2C1_SCL_PIN, PIN_HIGH);
#define OLED_SDA_0 rt_pin_write(BSP_I2C1_SDA_PIN, PIN_LOW);
#define OLED_SDA_1 rt_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;
}
}
另外,就是初始化部分有一些区别了,毕竟SPI和I2C的初始化不同
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;
}
4、演示视频
I2C-OLED
三、心得体会
在使用I2C的过程,参考了很多例程,但是在实际使用的时候,还是使用原来在其他芯片上使用的软件模拟I2C实现的,这个模拟是从时序开始的,但是在传输逻辑中,没有考虑应答这些,好在评测结果还是不错的。因此,感觉和I2C的start、stop、ack、nack等有一定的不同,尤其是I2C地址,因此本次的模拟应该是不完整的,由于在多个设备通讯时。本次评测j结束后,会考虑完整的I2C模拟。