本文首先介绍几个常用的RTT统一的标准的I2C接口,然后以I2C接口的EEPROM芯片AT24C02为例,演示如何在龙芯1C上用RTT统一的I2C接口读取EEPROM芯片AT24C02。
在本文之前,已经写过几篇关于龙芯1C上,模拟I2C和硬件I2C,在裸机程序中和RTT中使用的文章,如下
【龙芯1c库】封装硬件I2C接口和使用示例
http://blog.csdn.net/caogos/article/details/77891546
在RT-Thread上使用龙芯1c库中的硬件I2C接口
http://blog.csdn.net/caogos/article/details/77892951
【龙芯1c库】封装模拟I2C接口和使用示例
http://blog.csdn.net/caogos/article/details/73089406
这几篇文章都是以“龙芯1C库”为背景的,而本文的不同之处在于重点讨论RTT统一标准的I2C接口,在龙芯1C上的移植和使用。
本函数的作用是,向RTT添加注册一个I2C总线。本函数为龙芯1C定制的函数,具体的实现细节放到后面移植部分再讨论。
直接调用一下就行。
有的BSP里面是使用
INIT_DEVICE_EXPORT(ls1c_i2c_init);
的形式调用的,但在龙芯1C上没有这样采用。原因是每个人使用I2C时,可能使用不同的引脚。
下面来详细看看第二个参数的结构体定义
rt_i2c_msg为RTT为I2C封装的抽象概念。一次发送或接收,单独用一个msg来表示。
比如要读取AT24C02上某个地址的数据,先要把该数据的地址“写入”(发送)给AT24C02,然后再读取数据。这里面包含了两个msg,首先是一个写的msg,然后是一个读的msg。
在本文之前,已经写过几篇关于龙芯1C上,模拟I2C和硬件I2C,在裸机程序中和RTT中使用的文章,如下
【龙芯1c库】封装硬件I2C接口和使用示例
http://blog.csdn.net/caogos/article/details/77891546
在RT-Thread上使用龙芯1c库中的硬件I2C接口
http://blog.csdn.net/caogos/article/details/77892951
【龙芯1c库】封装模拟I2C接口和使用示例
http://blog.csdn.net/caogos/article/details/73089406
这几篇文章都是以“龙芯1C库”为背景的,而本文的不同之处在于重点讨论RTT统一标准的I2C接口,在龙芯1C上的移植和使用。
RTT统一的标准的I2C接口简介
初始化I2C
函数原型
int ls1c_i2c_init(void);
本函数的作用是,向RTT添加注册一个I2C总线。本函数为龙芯1C定制的函数,具体的实现细节放到后面移植部分再讨论。
使用示例
ls1c_i2c_init();
直接调用一下就行。
有的BSP里面是使用
INIT_DEVICE_EXPORT(ls1c_i2c_init);
的形式调用的,但在龙芯1C上没有这样采用。原因是每个人使用I2C时,可能使用不同的引脚。
Find设备
函数原型
/**
* This function finds a device driver by specified name.
*
* @param name the device driver's name
*
* @return the registered device driver on successful, or RT_NULL on failure.
*/
rt_device_t rt_device_find(const char *name)
函数rt_device_find()为RTT中通用的,find设备的函数。其它一些地方也可能会见到。入参为I2C总线的名字。I2C总线的名字在函数ls1c_i2c_init()中,调用函数rt_i2c_bit_add_bus()时注册的I2C总线名字。
使用示例
#define AT24C02_I2C_BUS_NAME ("i2c2")
struct rt_i2c_bus_device *at24c02_i2c_bus = RT_NULL;
// find设备
at24c02_i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(AT24C02_I2C_BUS_NAME);
if (RT_NULL == at24c02_i2c_bus)
{
rt_kprintf("[%s] no i2c device -- am2320!\n", __FUNCTION__);
return ;
}
收发I2C信息
函数原型
rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
struct rt_i2c_msg msgs[],
rt_uint32_t num)
本函数是I2C收发的核心函数。收发都是调用本函数。具体是收,还是发,第二个入参中有个flags来控制。第一个入参为I2C总线(前面已经使用函数rt_device_find()得到的I2C总线),第三个入参为msg的个数,注意要与第二个参数中的len区别。
下面来详细看看第二个参数的结构体定义
struct rt_i2c_msg
{
rt_uint16_t addr;
rt_uint16_t flags;
rt_uint16_t len;
rt_uint8_t *buf;
};
addr为I2C从机的地址,flags为此msg的一些标志,比如用来标记该msg是向从机读数据,还是写数据。len为此msg中收发数据的长度,buf为此msg收发的具体数据。
rt_i2c_msg为RTT为I2C封装的抽象概念。一次发送或接收,单独用一个msg来表示。
比如要读取AT24C02上某个地址的数据,先要把该数据的地址“写入”(发送)给AT24C02,然后再读取数据。这里面包含了两个msg,首先是一个写的msg,然后是一个读的msg。