RT-Thread设备框架使用指南——I2C总线设备简介.doc

上传人:白大夫 文档编号:3272772 上传时间:2019-08-07 格式:DOC 页数:5 大小:26KB
返回 下载 相关 举报
RT-Thread设备框架使用指南——I2C总线设备简介.doc_第1页
第1页 / 共5页
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《RT-Thread设备框架使用指南——I2C总线设备简介.doc》由会员分享,可在线阅读,更多相关《RT-Thread设备框架使用指南——I2C总线设备简介.doc(5页珍藏版)》请在三一文库上搜索。

1、RT-Thread设备框架使用指南I2C总线设备简介I2C 简介I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA(serial data),另一根是双向时钟线 SCL(serial clock)。SPI 总线有两根线分别用于主从设备之间接收数据和发送数据,而 I2C 总线只使用一根线进行数据收发。I2C 和 SPI 一样以主从的方式工作,不同于 SPI 一主多从的结构,它允许同时有多个主设备存在,每个连接到总线上的器件都有唯一的地址,主设备启动数据传输并

2、产生时钟信号,从设备被主设备寻址,同一时刻只允许有一个主设备。如下图所示:I2C 总线主从设备连接方式如下图所示为 I2C 总线主要的数据传输格式:I2C 总线数据传输格式当总线空闲时,SDA 和 SCL 都处于高电平状态,当主机要和某个从机通讯时,会先发送一个开始信号,然后发送从机地址和读写控制位,接下来传输数据(主机发送或者接收数据),数据传输结束时主机会发送结束信号。传输的每个字节为8位,高位在前,低位在后。数据传输过程中的不同名词详解如下所示:开始条件:SCL 为高电平时,主机将 SDA 拉低,表示数据传输即将开始。从机地址:主机发送的第一个字节为从机地址,高 7 位为地址,最低位为

3、R/W 读写控制位,1 表示读操作,0 表示写操作。一般从机地址有 7 位地址模式和 10 位地址模式两种,如果是 10 位地址模式,第一个字节的头 7 位 是 11110XX 的组合,其中最后两位(XX)是 10 位地址的两个最高位,第二个字节为 10 位从机地址的剩下8位,如下图所示:7 位地址和 10 位地址格式应答信号:每传输完成一个字节的数据,接收方就需要回复一个 ACK(acknowledge)。写数据时由从机发送 ACK,读数据时由主机发送 ACK。当主机读到最后一个字节数据时,可发送 NACK(Negative Acknowledgement)然后跟停止条件。数据:地址帧发送完

4、后可能会发送一些指令,依从机而定,然后开始传输数据,由主机或者从机发送,每个数据为 8 位,数据的字节数没有限制。重复开始条件:在一次通信过程中,主机可能需要和不同的从机传输数据或者需要切换读写操作时,主机可以再发送一个开始条件。停止条件:在 SDA 为低电平时,主机将 SCL 拉高并保持高电平,然后在将 SDA 拉高,表示传输结束。访问 I2C 总线设备一般情况下 MCU 的 I2C 器件都是作为主机和从机通讯,在 RT-Thread 中将 I2C 主机虚拟为 I2C总线设备,I2C 从机通过 I2C 设备接口和 I2C 总线通讯,相关接口如下所示:查找 I2C 总线设备在使用 I2C 总线

5、设备前需要根据 I2C 总线设备名称获取设备句柄,进而才可以操作 I2C 总线设备,查找设备函数如下所示,1rt_device_trt_device_find(constchar*name);1#defineAHT10_I2C_BUS_NAMEi2c1/*传感器连接的I2C总线设备名称*/2structrt_i2c_bus_device*i2c_bus;/*I2C总线设备句柄*/34/*查找I2C总线设备,获取I2C总线设备句柄*/5i2c_bus=(structrt_i2c_bus_device*)rt_device_find(name);一般情况下,注册到系统的 I2C 设备名称为 i2c

6、0 ,i2c1等,使用示例如下所示:数据传输获取到 I2C 总线设备句柄就可以使用 rt_i2c_transfer() 进行数据传输。函数原型如下所示:1rt_size_trt_i2c_transfer(structrt_i2c_bus_device*bus,2structrt_i2c_msgmsgs,3rt_uint32_tnum);和 SPI 总线的自定义传输接口一样,I2C 总线的自定义传输接口传输的数据也是以一个消息为单位。参数 msgs 指向待传输的消息数组,用户可以自定义每条消息的内容,实现 I2C 总线所支持的 2 种不同的数据传输模式。如果主设备需要发送重复开始信号,则需要发送

7、 2 个消息。I2C 消息数据结构原型如下:1structrt_i2c_msg23rt_uint16_taddr;/*从机地址*/4rt_uint16_tflags;/*读、写标志等*/5rt_uint16_tlen;/*读写数据字节数*/6rt_uint8_t*buf;/*读写数据缓冲区指针*/7从机地址 addr:支持 7 位和 10 位二进制地址,需查看不同设备的数据手册 。RT-Thread I2C 设备接口使用的从机地址均为不包含读写位的地址,读写位控制需修改标志 flags。标志 flags 可取值为以下宏定义,根据需要可以与其他宏使用位运算 “|” 组合起来使用。1#define

8、RT_I2C_WR0x0000/*写标志*/2#defineRT_I2C_RD(1u寄存器数据*/ 9staticrt_err_tread_regs(structrt_i2c_bus_device*bus,rt_uint8_tlen,rt_uint8_t*buf)1011structrt_i2c_msgmsgs;1213msgs.addr=AHT10_ADDR;/*从机地址*/14msgs.flags=RT_I2C_RD;/*读标志*/15msgs.buf=buf;/*读写数据缓冲区指针*/16msgs.len=len;/*读写数据字节数*/1718/*调用I2C设备接口传输数据*/19if(

9、rt_i2c_transfer(bus,2223else2425return-RT_ERROR;2627I2C 总线设备使用示例I2C 设备的具体使用方式可以参考如下示例代码,示例代码的主要步骤如下:首先根据 I2C 设备名称查找 I2C 名称,获取设备句柄,然后初始化 aht10 传感器。控制传感器的 2 的函数为写传感器寄存器 write_reg() 和读传感器寄存器 read_regs(),这两个函数分别调用了 rt_i2c_transfer() 传输数据。读取温湿度信息的函数 read_temp_humi() 则是调用这两个函数完成功能。1/* 2*程序清单:这是一个I2C设备使用例程

10、 3*例程导出了i2c_aht10_sample命令到控制终端 4*命令调用格式:i2c_aht10_samplei2c1 5*命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 6*程序功能:通过I2C设备读取温湿度传感器aht10的温湿度数据并打印 7*/ 8 9#include 10#include 11 12#defineAHT10_I2C_BUS_NAMEi2c1/*传感器连接的I2C总线设备名称*/ 13#defineAHT10_ADDR0x38/*从机地址*/ 14#defineAHT10_CALIBRATION_CMD0xE1/*校准命令*/

11、15#defineAHT10_NORMAL_CMD0xA8/*一般命令*/ 16#defineAHT10_GET_DATA0xAC/*获取数据命令*/ 17 18staticstructrt_i2c_bus_device*i2c_bus=RT_NULL;/*I2C总线设备句柄*/ 19staticrt_bool_tinitialized=RT_FALSE;/*传感器初始化状态*/ 20 21/*写传感器寄存器*/ 22staticrt_err_twrite_reg(structrt_i2c_bus_device*bus,rt_uint8_treg,rt_uint8_t*data) 23 24r

12、t_uint8_tbuf3; 25structrt_i2c_msgmsgs; 26 27buf0=reg;/cmd 28buf1=data0; 29buf2=data1; 30 31msgs.addr=AHT10_ADDR; 32msgs.flags=RT_I2C_WR; 33msgs.buf=buf; 34msgs.len=3; 35 36/*调用I2C设备接口传输数据*/ 37if(rt_i2c_transfer(bus, 40 41else 42 43return-RT_ERROR; 44 45 46 47/*读传感器寄存器数据*/ 48staticrt_err_tread_regs(s

13、tructrt_i2c_bus_device*bus,rt_uint8_tlen,rt_uint8_t*buf) 49 50structrt_i2c_msgmsgs; 51 52msgs.addr=AHT10_ADDR; 53msgs.flags=RT_I2C_RD; 54msgs.buf=buf; 55msgs.len=len; 56 57/*调用I2C设备接口传输数据*/ 58if(rt_i2c_transfer(bus, 61 62else 63 64return-RT_ERROR; 65 66 67 68staticvoidread_temp_humi(float*cur_temp,f

14、loat*cur_humi) 69 70rt_uint8_ttemp6; 71 72write_reg(i2c_bus,AHT10_GET_DATA,0);/*发送命令*/ 73read_regs(i2c_bus,6,temp);/*获取传感器数据*/ 74 75/*湿度数据转换*/ 76*cur_humi=(temp112|temp24|(temp3 77/*温度数据转换*/ 78*cur_temp=(temp3 79 80 81staticvoidaht10_init(constchar*name) 82 83rt_uint8_ttemp2=0,0; 84 85/*查找I2C总线设备,获取

15、I2C总线设备句柄*/ 86i2c_bus=(structrt_i2c_bus_device*)rt_device_find(name); 87 88if(i2c_bus=RT_NULL) 89 90rt_kprintf(cantfind%sdevice!n,name); 91 92else 93 94write_reg(i2c_bus,AHT10_NORMAL_CMD,temp); 95rt_thread_mdelay(400); 96 97temp0=0x08; 98temp1=0x00; 99write_reg(i2c_bus,AHT10_CALIBRATION_CMD,temp);10

16、0rt_thread_mdelay(400);101initialized=RT_TRUE;102103104105staticvoidi2c_aht10_sample(intargc,char*argv)106107floathumidity,temperature;108charnameRT_NAME_MAX;109110humidity=0.0;111temperature=0.0;112113if(argc=2)114115rt_strncpy(name,argv1,RT_NAME_MAX);116117else118119rt_strncpy(name,AHT10_I2C_BUS_N

17、AME,RT_NAME_MAX);120121122if(!initialized)123124/*传感器初始化*/125aht10_init(name);126127if(initialized)128129/*读取温湿度数据*/130read_temp_humi(131132rt_kprintf(readaht10sensorhumidity:%d.%d%n,(int)humidity,(int)(humidity*10)%10);133rt_kprintf(readaht10sensortemperature:%d.%dn,(int)temperature,(int)(temperature*10)%10);134135else136137rt_kprintf(initializesensorfailed!n);138139140/*导出到msh命令列表中*/141MSH_CMD_EXPORT(i2c_aht10_sample,i2caht10sample);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1