#define AT24C_ADDR 0x50 /// 注意这里是7bit地址
static struct rt_i2c_bus_device *at24c_dev = RT_NULL;
初始化设备:
void at24c_init(void)
{
/// 查找i2c总线
at24c_dev = (void*)rt_device_find("i2c1");
if(at24c_dev != RT_NULL)
{
rt_kprintf("i2c bus1 is found\r\n");
}
else
{
rt_kprintf("i2c bus1 not found\r\n");
}
}
读取数据:
int at24c_read(int addr, void *pdata, int len)
{
int ret;
struct rt_i2c_msg msg[2];
if(at24c_dev == RT_NULL)
{
return -1;
}
msg[0].addr = AT24C_ADDR;
msg[0].flags = RT_I2C_WR;
msg[0].buf = (void*)&addr;
msg[0].len = 1;
msg[1].addr = AT24C_ADDR;
msg[1].flags = RT_I2C_RD;
msg[1].buf = pdata;
msg[1].len = len;
ret = rt_i2c_transfer(at24c_dev, msg, 2);
if(ret == 2)
{
return 0;
}
else
{
return -1;
}
}
写操作:
int at24c_write_page(int addr, void *pdat, int len)
{
rt_uint8_t buff[40];
struct rt_i2c_msg msg;
buff[0] = addr;
rt_memcpy(&buff[1], pdat, len);
msg.addr = AT24C_ADDR;
msg.flags = RT_I2C_WR;
msg.buf = buff;
msg.len = len + 1;
if(rt_i2c_transfer(at24c_dev, &msg, 1) == 1)
{
return RT_EOK;
}
else
{
return RT_ERROR;
}
}
/// 写操作,需要进行分页处理
int at24c_write(int addr, void *pdat, int len)
{
int wlen;
char *p = pdat;
if(at24c_dev == RT_NULL)
{
return -1;
}
while(len > 0)
{
wlen = 8 - (addr & 0x07);
if(wlen > len)
{
wlen = len;
}
at24c_write_page(addr, p, wlen);
delayms(10);
len -= wlen;
addr += wlen;
p += wlen;
}
return 0;
}
添加I2C总线 修改board/Kconfig添加以下代码
menuconfig BSP_USING_I2C1
bool "Enable I2C1 BUS (software simulation)"
default n
select RT_USING_I2C
select RT_USING_I2C_BITOPS
select RT_USING_PIN
if BSP_USING_I2C1
config BSP_I2C1_SCL_PIN
int "i2c1 scl pin number"
range 1 100
default 22
config BSP_I2C1_SDA_PIN
int "I2C1 sda pin number"
range 1 100
default 23
endif
即可用menuconfig来配置
改进版的配置:
menuconfig BSP_USING_I2C
bool "Enable I2C"
select RT_USING_I2C
select RT_USING_I2C_BITOPS
default n
if BSP_USING_I2C
config BSP_USING_I2C1
bool "Enable I2C1 BUS (software simulation)"
default n
select RT_USING_PIN
if BSP_USING_I2C1
config BSP_I2C1_SCL_PIN
int "i2c1 scl pin number"
range 1 100
default 22
config BSP_I2C1_SDA_PIN
int "I2C1 sda pin number"
range 1 100
default 23
endif
config BSP_USING_I2C2
bool "Enable I2C2 BUS (software simulation)"
default n
select RT_USING_PIN
if BSP_USING_I2C2
config BSP_I2C2_SCL_PIN
int "i2c2 scl pin number"
range 1 100
default 48
config BSP_I2C2_SDA_PIN
int "I2C2 sda pin number"
range 1 100
default 49
endif
endif
- 阅读全文 -