uboot中 使用i2c

uboot中i2c读写有2种方式,一种使用uboot驱动模型,通过宏 CONFIG_DM_I2C定义,另一种是传统方式,通过宏CONFIG_SYS_I2C定义。

传统方式——SYS_I2C

1.设置总线号
int i2c_set_bus_num(unsigned int bus);

2.读/写
int i2c_read(uint8_t chip, unsigned int addr, int alen, uint8_t *buffer, int len);
int i2c_write(uint8_t chip, unsigned int addr, int alen, uint8_t *buffer, int len);
uint8_t i2c_reg_read(uint8_t addr, uint8_t reg);
void i2c_reg_write(uint8_t addr, uint8_t reg, uint8_t val);

函数实现见: drivers/i2c/i2c_core.c

DM驱动模型——DM_I2C

1.根据uclass id和总线编号,获取总线udevice
int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp);

2.获取设备udevice
int i2c_get_chip(struct udevice *bus, uint chip_addr, uint offset_len, struct udevice **devp);

3.设置设备寄存器地址长度
int i2c_set_chip_offset_len(struct udevice *dev, uint offset_len);

4.读/写
int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len);
int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len);
int dm_i2c_reg_read(struct udevice *dev, uint offset);
int dm_i2c_reg_write(struct udevice *dev, uint offset, uint value);

函数实现见: drivers/i2c/i2c-uclass.c

DM_I2C对SYS_I2C的兼容

DM_I2C在drivers/i2c/i2c-uclass-compat.c中,通过定义宏 CONFIG_DM_I2C_COMPAT,实现了SYS_I2C的兼容,从SYS_I2C切换到DM_I2C时,不用修改原来SYS_I2C的i2c读写流程代码

uboot中使用I2C命令进行读写

在uboot命令行中,通过定义宏CONFIG_CMD_I2C,可以打开i2c cmd 子系统。输入i2c查看 usage。

i2c bus - 查看当前总线

i2c dev [dev] - 设置总线号

i2c md chip address[.0, .1, .2] [# of objects] - i2c设备读

i2c mw chip address[.0, .1, .2] value [count] - i2c设备写

=> i2c bus
Bus 2:  i2c@48060000  (active 2)
   58: generic_58, offset len 1, flags 0
   6b: generic_6b, offset len 1, flags 0
   6a: generic_6a, offset len 1, flags 0
=> i2c dev 2
Setting bus to 2
=> i2c md 6b d0.1 1
00d0: 14    .
=> i2c mw 6b d0.1 0x15 1
=> 

 

### U-Boot环境中I2C命令的使用 在U-Boot环境下,可以利用`i2c`命令来进行I2C总线的操作。这些命令允许用户读取、写入数据以及探测连接到特定I2C总线上的设备。 #### 探测I2C设备 为了检测已连接至指定I2C适配器的所有器件,可执行如下指令: ```bash i2c probe <bus> ``` 这里 `<bus>` 是指要扫描的具体I2C总线条数。此命令有助于确认目标板上哪些地址存在有效的I2C从机设备[^1]。 #### 设置I2C速度 有时可能需要调整通信速率以匹配硬件需求或优化性能。可通过下面这条语句完成设定工作: ```bash set i2c speed <speed_in_khz> ``` 参数 `speed_in_khz` 表示期望的数据传输率单位为kHz。例如,如果想要把频率设为400KHz,则应输入 `set i2c speed 400`。 #### 对I2C设备进行读/写操作 当明确了具体的I2C地址后,就可以向该位置发送数据包或是从中获取信息了。对于简单的单字节交互来说,有两条基本语法可供选用: - **读取寄存器值** ```bash md.i2c <addr> <reg> ``` - **写入寄存器值** ```bash mw.i2c <addr> <reg> <value> ``` 上述命令中的 `<addr>` 即为目标芯片的7位物理地址;而 `<reg>` 则代表内部存储单元编号;最后一个是待传送的新数值或者是用来指示返回多少个连续内存格的内容长度。 #### 示例:与DS1307实时时钟模块互动 假设有一个基于I2C接口工作的RTC(实时钟)电路安装在系统里,并且它的默认I2C地址是0x68。那么现在演示如何查询当前时间并更新日期设置的过程。 - 查询时间 ```bash => md.i2c 0x68 0 ``` - 修改时间为“2023年5月1日星期一上午9点整” ```bash => mw.i2c 0x68 0 0x00 # 秒=0秒 => mw.i2c 0x68 1 0x39 # 分=9分 (BCD编码) => mw.i2c 0x68 2 0x09 # 小时=9小时 (24小时制, BCD编码) => mw.i2c 0x68 4 0x01 # 日=1号 => mw.i2c 0x68 5 0x05 # 月份=五月 => mw.i2c 0x68 6 0x23 # 年份=23年 (自2000年起算) ``` 请注意,在实际应用过程中还需要考虑其他因素比如电源管理状态的影响等细节问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值