在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳細(xì)講解RT-Thread I2C設(shè)備驅(qū)動(dòng)框架及相關(guān)函數(shù)

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:未知 ? 作者:李倩 ? 2018-03-29 10:52 ? 次閱讀

本應(yīng)用筆記以驅(qū)動(dòng)I2C接口的6軸傳感器MPU6050為例,說(shuō)明了如何使用I2C設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序,并詳細(xì)講解了RT-Thread I2C設(shè)備驅(qū)動(dòng)框架及相關(guān)函數(shù)。

1 本文的目的和結(jié)構(gòu)

1.1 本文的目的和背景

I2C(或?qū)懽鱥2c、IIC、iic)總線(xiàn)是由Philips公司開(kāi)發(fā)的一種簡(jiǎn)單、雙向二線(xiàn)制(時(shí)鐘SCL、數(shù)據(jù)SDA)同步串行總線(xiàn)。它只需要兩根線(xiàn)即可在連接于總線(xiàn)上的器件之間傳送信息,是半導(dǎo)體芯片使用最為廣泛的通信接口之一。RT-Thread中引入了I2C設(shè)備驅(qū)動(dòng)框架,I2C設(shè)備驅(qū)動(dòng)框架提供了基于GPIO模擬和硬件控制器的2種底層硬件接口。

1.2 本文的結(jié)構(gòu)

本文首先描述了RT-Thread I2C設(shè)備驅(qū)動(dòng)框架的基本情況,然后詳細(xì)描述了I2C設(shè)備驅(qū)動(dòng)接口,并使用I2C設(shè)備驅(qū)動(dòng)接口編寫(xiě)MPU6050的驅(qū)動(dòng)程序,并給出了在正點(diǎn)原子STM32F4探索者開(kāi)發(fā)板上驗(yàn)證的代碼示例。

2 I2C設(shè)備驅(qū)動(dòng)框架簡(jiǎn)介

在使用MCU進(jìn)行項(xiàng)目開(kāi)發(fā)的時(shí)候,往往需要用到I2C總線(xiàn)。一般來(lái)說(shuō),MCU帶有I2C控制器(硬件I2C),也可以使用MCU的2個(gè)GPIO自行編寫(xiě)程序模擬I2C總線(xiàn)協(xié)議實(shí)現(xiàn)同樣的功能。

RT-Thread提供了一套I/O設(shè)備管理框架,它把I/O設(shè)備分成了三層進(jìn)行處理:應(yīng)用層、I/O設(shè)備管理層、底層驅(qū)動(dòng)。I/O設(shè)備管理框架給上層應(yīng)用提供了統(tǒng)一的設(shè)備操作接口和I2C設(shè)備驅(qū)動(dòng)接口,給下層提供的是底層驅(qū)動(dòng)接口。應(yīng)用程序通過(guò)I/O設(shè)備模塊提供的標(biāo)準(zhǔn)接口訪(fǎng)問(wèn)底層設(shè)備,底層設(shè)備的變更不會(huì)對(duì)上層應(yīng)用產(chǎn)生影響,這種方式使得應(yīng)用程序具有很好的可移植性,應(yīng)用程序可以很方便的從一個(gè)MCU移植到另外一個(gè)MCU。

本文以6軸慣性傳感器MPU6050為例,使用RT-Thread I2C設(shè)備驅(qū)動(dòng)框架提供的GPIO模擬I2C控制器的方式,闡述了應(yīng)用程序如何使用I2C設(shè)備驅(qū)動(dòng)接口訪(fǎng)問(wèn)I2C設(shè)備。

圖2-1 RT-Thread I2C設(shè)備驅(qū)動(dòng)框架

3 運(yùn)行I2C設(shè)備驅(qū)動(dòng)示例代碼

3.1 示例代碼軟硬件平臺(tái)

正點(diǎn)原子STM32F4探索者開(kāi)發(fā)板

GY-521 MPU-6050模塊

MDK5

RT-Thread 源碼

正點(diǎn)原子探索者STM32F4 開(kāi)發(fā)板的MCU是STM32F407ZGT6,本示例使用USB串口(USART1)發(fā)送數(shù)據(jù)及供電,使用SEGGER JLINK連接JTAG調(diào)試。

本次實(shí)驗(yàn)用的GY521模塊是一款6軸慣性傳感器模塊,板載MPU6050。我們使用開(kāi)發(fā)板的PD6(SCL)、PD7(SDA)作為模擬I2C管腳,用杜邦線(xiàn)將GY521模塊的SCL硬件連接到PD6、SDA連接到PD7、GND連接到開(kāi)發(fā)板的GND、VCC連接到3.3V。

圖3.1-1 正點(diǎn)原子開(kāi)發(fā)板

圖3.1-2 GY521模塊

本文基于正點(diǎn)原子STM32F4探索者開(kāi)發(fā)板,給出了底層I2C驅(qū)動(dòng)(GPIO模擬方式)的添加方法和I2C設(shè)備的具體應(yīng)用示例代碼(以驅(qū)動(dòng)MPU6050為例),包含寄存器讀、寫(xiě)操作方法。由于RT-Thread上層應(yīng)用API的通用性,因此這些代碼不局限于具體的硬件平臺(tái),用戶(hù)可以輕松將它移植到其它平臺(tái)上。

3.2 啟用I2C設(shè)備驅(qū)動(dòng)

使用env工具命令行進(jìn)入 rt-threadspstm32f4xx-HAL 目錄,然后輸入menuconfig命令進(jìn)入配置界面。

配置shell使用串口1:選中Using UART1,進(jìn)入RT-Thread Kernel ---> Kernel Device Object菜單,修改the device name for console為uart1。

進(jìn)入RT-Thread Components ---> Device Drivers菜單,選中 Using I2C device drivers,本示例使用GPIO模擬I2C,因此還要開(kāi)啟 Use GPIO to simulate I2C。

圖3.2-1 使用menuconfig開(kāi)啟i2c

退出menuconfig配置界面并保存配置,在env命令行輸入scons --target=mdk5 -s命令生成mdk5工程,新工程名為project。使用MDK5打開(kāi)工程,修改MCU型號(hào)為STM32F407ZGTx,修改調(diào)試選項(xiàng)為J-LINK。

圖3.2-2 修改MCU

圖3.2-3 修改調(diào)試選項(xiàng)

2.編譯工程后下載程序至開(kāi)發(fā)板運(yùn)行。在終端PuTTY(打開(kāi)對(duì)應(yīng)端口,波特率配置為115200)輸入list_device命令可以看到名為i2c2的設(shè)備,設(shè)備類(lèi)型是I2C Bus,說(shuō)明I2C設(shè)備驅(qū)動(dòng)添加成功了。如圖所示:

圖3.2-4使用list_device命令查看i2c總線(xiàn)

3.3 運(yùn)行示例代碼

將I2C示例代碼(請(qǐng)回復(fù)AN0003,下載示例代碼)里的main.c拷貝到 t-threadspstm32f4xx-HALapplications目錄,替換原有的main.c。drv_mpu6050.c、drv_mpu6050.h拷貝到 t-threadspstm32f4xx-HALdrivers目錄,并將它們添加到工程中對(duì)應(yīng)分組。如圖所示:

圖3.3-1 添加驅(qū)動(dòng)

本例使用GPIO PD6作為SCL、GPIO PD7作為SDA,I2C總線(xiàn)名字是i2c2,讀者可根據(jù)需要修改drv_i2c.c件中如下參數(shù)以適配自己的板卡,確保drv_mpu6050.c中定義的宏MPU6050_I2C_BUS_NAME與drv_i2c.c中的宏I2C_BUS_NAME相同。本示例需要將drv_i2c.c默認(rèn)驅(qū)動(dòng)端口GPIOB改為GPIOD,如下圖所示:

圖3.3-2 drv_i2c.c中的i2c板級(jí)配置

連接好MPU6050模塊和開(kāi)發(fā)板,編譯工程并下載程序至開(kāi)發(fā)板,復(fù)位MCU,終端PuTTY會(huì)打印出讀取到的MPU6050傳感器數(shù)據(jù),依次是溫度,三軸加速度,三軸角速度:

圖3.3-3 終端打印信息

4 I2C設(shè)備驅(qū)動(dòng)接口詳解

按照前文的步驟,相信讀者能很快的將RT-Thread I2C設(shè)備驅(qū)動(dòng)運(yùn)行起來(lái),那么如何使用I2C設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序呢?

RT-Thread I2C設(shè)備驅(qū)動(dòng)目前只支持主機(jī)模式,使用RT-Thread I2C設(shè)備驅(qū)動(dòng)需要使用menuconfig工具開(kāi)啟宏RT_USING_DEVICE和RT_USING_I2C,如果要使用GPIO模擬I2C還需開(kāi)啟宏RT_USING_I2C_BITOPS。

使用I2C設(shè)備驅(qū)動(dòng)的大致流程如下:

用戶(hù)可以在msh shell輸入list_device命令查看已有的I2C設(shè)備,確定I2C設(shè)備名稱(chēng)。

查找設(shè)備使用rt_i2c_bus_device_find()或者rt_device_find(),傳入I2C設(shè)備名稱(chēng)獲取i2c總線(xiàn)設(shè)備句柄。

使用rt_i2c_transfer()即可以發(fā)送數(shù)據(jù)也可以接收數(shù)據(jù),如果主機(jī)只發(fā)送數(shù)據(jù)可以使用rt_i2c_master_send(),如果主機(jī)只接收數(shù)據(jù)可以使用rt_i2c_master_recv()。

接下來(lái)本章將詳細(xì)講解I2C設(shè)備驅(qū)動(dòng)接口的使用。

4.1 查找設(shè)備

應(yīng)用程序要使用已經(jīng)由操作系統(tǒng)管理的I2C設(shè)備需要調(diào)用查找設(shè)備函數(shù),找到I2C設(shè)備后才可以對(duì)該設(shè)備進(jìn)行信息傳送。

函數(shù)原型:struct rt_i2c_bus_device *rt_i2c_bus_device_find(const char *bus_name)

參數(shù) 描述
bus_name I2C設(shè)備名稱(chēng)

函數(shù)返回:I2C設(shè)備存在則返回I2C設(shè)備句柄,否則返回RT_NULL。

本文示例代碼底層驅(qū)動(dòng)drv_mpu6050.c中mpu6050_hw_init()查找設(shè)備源碼如下:

#define MPU6050_I2CBUS_NAME "i2c2" /* I2C設(shè)備名稱(chēng),必須和drv_i2c.c注冊(cè)的I2C設(shè)備名稱(chēng)一致 */ static struct rt_i2c_bus_device *mpu6050_i2c_bus; /* I2C設(shè)備句柄 */ ... ... ... ... int mpu6050_hw_init(void) { rt_uint8_t res; mpu6050_i2c_bus = rt_i2c_bus_device_find(MPU6050_I2CBUS_NAME); /*查找I2C設(shè)備*/ if (mpu6050_i2c_bus == RT_NULL) { MPUDEBUG("can't find mpu6050 %s device ",MPU6050_I2CBUS_NAME); return -RT_ERROR; } ... ... ... ... }

4.2 數(shù)據(jù)傳輸

RT-Thread I2C設(shè)備驅(qū)動(dòng)的核心API是rt_i2c_transfer(),它傳遞的消息是鏈?zhǔn)浇Y(jié)構(gòu)的。可以通過(guò)消息鏈,實(shí)現(xiàn)調(diào)用一次完成多次數(shù)據(jù)的收發(fā),此函數(shù)既可以用于發(fā)送數(shù)據(jù),也可以用于接收數(shù)據(jù)。

函數(shù)原型:

rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)

參數(shù) 描述
bus I2C總線(xiàn)設(shè)備句柄
msgs[] I2C消息數(shù)組
num 消息數(shù)組的數(shù)量

函數(shù)返回: 成功傳輸?shù)南?shù)組的數(shù)量

消息數(shù)組msgs[]類(lèi)型為

struct rt_i2c_msg { rt_uint16_t addr; //從機(jī)地址 rt_uint16_t flags; //標(biāo)志,讀、寫(xiě)等 rt_uint16_t len; //讀寫(xiě)數(shù)據(jù)字節(jié)數(shù) rt_uint8_t *buf; //讀寫(xiě)數(shù)據(jù)指針 }

addr從機(jī)地址支持7位和10位二進(jìn)制地址(flags |= RT_I2C_ADDR_10BIT)。RT-Thread的I2C設(shè)備驅(qū)動(dòng)接口使用的從機(jī)地址均為不包含讀寫(xiě)位的地址,讀寫(xiě)位對(duì)應(yīng)修改flags。

flags標(biāo)志可選值為i2c.h文件中定義的宏,發(fā)送數(shù)據(jù)賦值 RT_I2C_WR,接收數(shù)據(jù)賦值RT_I2C_RD,根據(jù)需要可以與其他宏使用位運(yùn)算“|”組合起來(lái)使用。

#define RT_I2C_WR 0x0000 #define RT_I2C_RD (1u << 0) #define RT_I2C_ADDR_10BIT ?(1u << 2) /* this is a ten bit chip address */ #define RT_I2C_NO_START ? ?(1u << 4) #define RT_I2C_IGNORE_NACK (1u << 5) #define RT_I2C_NO_READ_ACK (1u << 6) /* when I2C reading, we do not ACK */

4.2.1 發(fā)送數(shù)據(jù)

用戶(hù)可以調(diào)用I2C設(shè)備驅(qū)動(dòng)接口rt_i2c_master_send()或者rt_i2c_transfer()發(fā)送數(shù)據(jù)。函數(shù)調(diào)用關(guān)系如下:

圖4.2.1-1 發(fā)送數(shù)據(jù)函數(shù)調(diào)用關(guān)系

drv_mpu6050.c中的mpu6050_write_reg()函數(shù)是MCU向mpu6050寄存器寫(xiě)數(shù)據(jù)。此函數(shù)的實(shí)現(xiàn)共有2種,分別調(diào)用了I2C設(shè)備驅(qū)動(dòng)接口rt_i2c_transfer()和rt_i2c_master_send()實(shí)現(xiàn)。

本文示例使用的MPU6050數(shù)據(jù)手冊(cè)中提到7位從機(jī)地址是110100X,X由芯片的AD0管腳決定,GY521模塊的AD0連接到了GND,因此MPU6050作為從機(jī)時(shí)地址是1101000,16進(jìn)制形式是0x68。寫(xiě)MPU6050某個(gè)寄存器,主機(jī)首先發(fā)送從機(jī)地址MPU6050_ADDR、讀寫(xiě)標(biāo)志 R/W 為 RT_I2C_WR(0 為寫(xiě),1 為讀),然 后主機(jī)發(fā)送從機(jī)寄存器地址reg及數(shù)據(jù)data。

使用rt_i2c_transfer()發(fā)送數(shù)據(jù)

本文示例代碼底層驅(qū)動(dòng)drv_mpu6050.c發(fā)送數(shù)據(jù)源碼如下:

#define MPU6050_ADDR 0X68 //寫(xiě)mpu6050單個(gè)寄存器 //reg:寄存器地址 //data:數(shù)據(jù) //返回值: 0,正常 / -1,錯(cuò)誤代碼 rt_err_t mpu6050_write_reg(rt_uint8_t reg, rt_uint8_t data) { struct rt_i2c_msg msgs; rt_uint8_t buf[2] = {reg, data}; msgs.addr = MPU6050_ADDR; /* 從機(jī)地址 */ msgs.flags = RT_I2C_WR; /* 寫(xiě)標(biāo)志 */ msgs.buf = buf; /* 發(fā)送數(shù)據(jù)指針 */ msgs.len = 2; if (rt_i2c_transfer(mpu6050_i2c_bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } }

以本文示例代碼其中一次調(diào)用rt_i2c_transfer()發(fā)送數(shù)據(jù)為例,從機(jī)MPU6050地址16進(jìn)制值為0X68,寄存器地址reg 16進(jìn)制值為0X6B,發(fā)送的數(shù)據(jù)data 16進(jìn)制值為0X80。示例波形如下圖所示,第一個(gè)發(fā)送的數(shù)據(jù)是0XD0,第一個(gè)數(shù)據(jù)的高7位是從機(jī)地址,最低位是讀寫(xiě)位為寫(xiě)(值為0),所以第一個(gè)數(shù)據(jù)為:0X68 << 1|0 = 0XD0,然后依次發(fā)送寄存器地址0X6B和數(shù)據(jù)0X80。

圖4.2.1-2 I2C發(fā)送數(shù)據(jù)波形示例

使用rt_i2c_master_send()發(fā)送數(shù)據(jù)

函數(shù)原型:

rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus, rt_uint16_t addr, rt_uint16_t flags, const rt_uint8_t *buf, rt_uint32_t count)

參數(shù) 描述
bus I2C總線(xiàn)設(shè)備句柄
addr 從機(jī)地址,不包含讀寫(xiě)位
flags 標(biāo)志,讀寫(xiě)標(biāo)志為寫(xiě)。只支持10位地址選擇RT_I2C_ADDR_10BIT
buf 指向發(fā)送數(shù)據(jù)的指針
count 發(fā)送數(shù)據(jù)字節(jié)數(shù)

函數(shù)返回: 成功發(fā)送的數(shù)據(jù)字節(jié)數(shù)。

此函是對(duì)rt_i2c_transfer()的簡(jiǎn)單封裝。

本文示例代碼底層驅(qū)動(dòng)drv_mpu6050.c發(fā)送數(shù)據(jù)源碼如下:

#define MPU6050_ADDR 0X68 //寫(xiě)mpu6050單個(gè)寄存器 //reg:寄存器地址 //data:數(shù)據(jù) //返回值: 0,正常 / -1,錯(cuò)誤代碼 rt_err_t mpu6050_write_reg(rt_uint8_t reg, rt_uint8_t data) { rt_uint8_t buf[2]; buf[0] = reg; buf[1] = data; if (rt_i2c_master_send(mpu6050_i2c_bus, MPU6050_ADDR, 0, buf ,2) == 2) { return RT_EOK; } else { return -RT_ERROR; } }

4.2.2 接收數(shù)據(jù)

用戶(hù)可以調(diào)用I2C設(shè)備驅(qū)動(dòng)接口rt_i2c_master_recv()或者rt_i2c_transfer()接受數(shù)據(jù)。函數(shù)調(diào)用關(guān)系如下:

圖4.2.2-1 接收數(shù)據(jù)函數(shù)調(diào)用關(guān)系

本文示例代碼drv_mpu6050.c中的mpu6050_read_reg()函數(shù)是MCU從MPU6050寄存器讀取數(shù)據(jù),此函數(shù)的實(shí)現(xiàn)同樣有2種方式,分別調(diào)用了I2C設(shè)備驅(qū)動(dòng)接口rt_i2c_transfer()和rt_i2c_master_recv()實(shí)現(xiàn)。

讀MPU6050某個(gè)寄存器,主機(jī)首先發(fā)送從機(jī)地址MPU6050_ADDR、讀寫(xiě)標(biāo)志 R/W 為 RT_I2C_WR(0 為寫(xiě),1 為讀)、從機(jī)寄存器地址reg之后才能開(kāi)始讀設(shè)備。然后發(fā)送從機(jī)地址MPU6050_ADDR、讀寫(xiě)標(biāo)志 R/W 為 RT_I2C_RD(0 為寫(xiě),1 為讀)、保存讀取數(shù)據(jù)指針。

使用rt_i2c_transfer()接收數(shù)據(jù)

本文示例代碼底層驅(qū)動(dòng)drv_mpu6050.c接收數(shù)據(jù)源碼如下:

#define MPU6050_ADDR 0X68 //讀取寄存器數(shù)據(jù) //reg:要讀取的寄存器地址 //len:要讀取的數(shù)據(jù)字節(jié)數(shù) //buf:讀取到的數(shù)據(jù)存儲(chǔ)區(qū) //返回值: 0,正常 / -1,錯(cuò)誤代碼 rt_err_t mpu6050_read_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf) { struct rt_i2c_msg msgs[2]; msgs[0].addr = MPU6050_ADDR; /* 從機(jī)地址 */ msgs[0].flags = RT_I2C_WR; /* 寫(xiě)標(biāo)志 */ msgs[0].buf = ® /* 從機(jī)寄存器地址 */ msgs[0].len = 1; /* 發(fā)送數(shù)據(jù)字節(jié)數(shù) */ msgs[1].addr = MPU6050_ADDR; /* 從機(jī)地址 */ msgs[1].flags = RT_I2C_RD; /* 讀標(biāo)志 */ msgs[1].buf = buf; /* 讀取數(shù)據(jù)指針 */ msgs[1].len = len; /* 讀取數(shù)據(jù)字節(jié)數(shù) */ if (rt_i2c_transfer(mpu6050_i2c_bus, msgs, 2) == 2) { return RT_EOK; } else { return -RT_ERROR; } }

以本文示例代碼其中一次調(diào)用rt_i2c_transfer()接收數(shù)據(jù)為例,從機(jī)MPU6050地址16進(jìn)制值為0X68,寄存器地址reg 16進(jìn)制值為0X75。示例波形如下圖所示,第一個(gè)發(fā)送的數(shù)據(jù)是0XD0,第一個(gè)數(shù)據(jù)的高7位是從機(jī)地址,最低位是讀寫(xiě)位是寫(xiě)(值為0),所以第一個(gè)數(shù)據(jù)值為:0X68 << 1|0 = 0XD0,然后發(fā)送寄存器地址0X75。第二次發(fā)送的第一個(gè)數(shù)據(jù)為0XD1,讀寫(xiě)位是讀(值為1),值為:0X68 << 1 | 1 = 0XD1,然后收到讀取到的數(shù)據(jù)0X68。

圖4.2.2-2 I2C發(fā)送數(shù)據(jù)波形示例

使用 rt_i2c_master_recv()接收數(shù)據(jù)

函數(shù)原型:

rt_size_t rt_i2c_master_recv(struct rt_i2c_bus_device *bus, rt_uint16_t addr, rt_uint16_t flags, rt_uint8_t *buf, rt_uint32_t count)

參數(shù) 描述
bus I2C總線(xiàn)設(shè)備句柄
addr 從機(jī)地址,不包含讀寫(xiě)位
flags 標(biāo)志,讀寫(xiě)標(biāo)志為讀,只支持10位地址選擇RT_I2C_ADDR_10BIT
buf 接受數(shù)據(jù)指針
count 接收數(shù)據(jù)字節(jié)數(shù)

函數(shù)返回: 成功接收的數(shù)據(jù)字節(jié)數(shù)。

此函數(shù)是對(duì)rt_i2c_transfer()的簡(jiǎn)單封裝,只能讀取數(shù)據(jù)(接收數(shù)據(jù))。

本文示例代碼底層驅(qū)動(dòng)drv_mpu6050.c接收數(shù)據(jù)源碼如下:

#define MPU6050_ADDR 0X68 //讀取寄存器數(shù)據(jù) //reg:要讀取的寄存器地址 //len:要讀取的數(shù)據(jù)字節(jié)數(shù) //buf:讀取到的數(shù)據(jù)存儲(chǔ)區(qū) //返回值: 0,正常 / -1,錯(cuò)誤代碼 rt_err_t mpu6050_read_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf) { if (rt_i2c_master_send(mpu6050_i2c_bus, MPU6050_ADDR, 0, ®, 1) == 1) { if (rt_i2c_master_recv(mpu6050_i2c_bus, MPU6050_ADDR, 0, buf, len) == len) { return RT_EOK; } else { return -RT_ERROR; } } else { return -RT_ERROR; } }

4.3 I2C設(shè)備驅(qū)動(dòng)應(yīng)用

通常I2C接口芯片的只讀寄存器分為2種情況,一種是單一功能寄存器,另一種是地址連續(xù),功能相近的寄存器。例如MPU6050的寄存器0X3B、0X3C、0X3D、0X3E、0X3F、0X40依次存放的是三軸加速度X、Y、Z軸的高8位、低8位數(shù)據(jù)。

本文示例代碼底層驅(qū)動(dòng)drv_mpu6050.c使用mpu6050_read_reg()函數(shù)讀取MPU6050的3軸加速度數(shù)據(jù):

#define MPU_ACCEL_XOUTH_REG 0X3B //加速度值,X軸高8位寄存器 //得到加速度值(原始值) //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(shù)(帶符號(hào)) //返回值:0,成功/ -1,錯(cuò)誤代碼 rt_err_t mpu6050_accelerometer_get(rt_int16_t *ax, rt_int16_t *ay, rt_int16_t *az) { rt_uint8_t buf[6], ret; ret = mpu6050_read_reg(MPU_ACCEL_XOUTH_REG, 6, buf); if (ret == 0) { *ax = ((rt_uint16_t)buf[0] << 8) | buf[1]; ? ? ? ? ?*ay = ((rt_uint16_t)buf[2] << 8) | buf[3]; ? ? ? ? ?*az = ((rt_uint16_t)buf[4] << 8) | buf[5]; ? ? ? ? ? ? ? ?return RT_EOK; ? ?} ? ?else ? ?{ ? ? ? ?return -RT_ERROR; ? ?} ? ? ? }

5 參考

本文所有相關(guān)的API

API 頭文件
rt_i2c_transfer() rt-threadcomponentsdriversincludedriversi2c.h
rt_i2c_master_send() rt-threadcomponentsdriversincludedriversi2c.h
rt_i2c_master_recv() rt-threadcomponentsdriversincludedriversi2c.h
mpu6050_hw_init() drv_mpu6050.h
mpu6050_write_reg() drv_mpu6050.h
mpu6050_read_reg() drv_mpu6050.h
mpu6050 _temperature_get() drv_mpu6050.h
mpu6050 _gyroscope_get() drv_mpu6050.h
mpu6050 _accelerometer_get() drv_mpu6050.h

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1522

    瀏覽量

    126663
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63931
  • 設(shè)備驅(qū)動(dòng)

    關(guān)注

    0

    文章

    68

    瀏覽量

    11071

原文標(biāo)題:【應(yīng)用筆記】小白也能玩轉(zhuǎn)RT-Thread之I2C設(shè)備

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于RT-Thread的RoboMaster電控框架設(shè)計(jì)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇
    發(fā)表于 09-06 15:21 ?901次閱讀

    分析rt-threadI2C設(shè)備驅(qū)動(dòng)框架

    簡(jiǎn)要上一篇分析了RTT的PIN驅(qū)動(dòng),得到了很多網(wǎng)友的認(rèn)可,很開(kāi)心。很多人跟我反映寫(xiě)一些u***,wlan等框架,這個(gè)一步一步來(lái),從淺到深。這一篇文章我們來(lái)分析rt-threadI2C
    發(fā)表于 01-12 06:23

    RT-ThreadI2C設(shè)備驅(qū)動(dòng)框架對(duì)接如何實(shí)現(xiàn)

    RT-Thread中引入了I2C設(shè)備設(shè)備驅(qū)動(dòng)框架,該驅(qū)動(dòng)
    發(fā)表于 05-19 17:11

    將硬件I2C嫁接到RTT原生的模擬I2C驅(qū)動(dòng)框架步驟分享

    。那硬件i2c驅(qū)動(dòng)框架那更不在話(huà)下啦。但到了目前最新版的rt-thread OS就是沒(méi)有,著實(shí)令人費(fèi)解。原作者:07lhluo
    發(fā)表于 07-07 16:29

    基于STM32L431RCT6講解如何使用I2C設(shè)備接口及相關(guān)軟件包

    中。由于 RT-Thread Nano 沒(méi)有設(shè)備驅(qū)動(dòng)框架,所以我們要把 i2c.h 中有關(guān)完整版的內(nèi)容去掉。整理完之后的
    發(fā)表于 07-18 11:24

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    、I2C通訊)STM32L051上使用RT-Thread (四、串口通訊)STM32L051上使用RT-Thread (五、完結(jié)篇)2. RT-Th
    發(fā)表于 07-26 14:56

    如何使用I2C設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序

    摘要本應(yīng)用筆記以驅(qū)動(dòng) I2C 接口的 6 軸傳感器 MPU6050 為例,說(shuō)明了如何使用 I2C 設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序,并
    發(fā)表于 08-18 10:54

    如何使用RT-Thread的串口設(shè)備

    rt_hw_serial_register 決定的,該函數(shù)將串口硬件驅(qū)動(dòng)RT-Thread 設(shè)備管理
    發(fā)表于 10-25 11:05

    詳解RT-Thread I2C設(shè)備驅(qū)動(dòng)框架相關(guān)函數(shù)

    摘要本應(yīng)用筆記以驅(qū)動(dòng) I2C 接口的 6 軸傳感器 MPU6050 為例,說(shuō)明了如何使用 I2C 設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序,并
    發(fā)表于 10-25 12:02

    如何使用RT-Thread SPI設(shè)備驅(qū)動(dòng)

    上運(yùn)行了SPI設(shè)備驅(qū)動(dòng)示例代碼。最后詳細(xì)描述SPI設(shè)備驅(qū)動(dòng)框架接口的使用方法及參數(shù)取值。SPI
    發(fā)表于 10-25 14:20

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)方式介紹如下:
    的頭像 發(fā)表于 05-28 10:38 ?2332次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>設(shè)備</b>模型<b class='flag-5'>框架</b>及創(chuàng)建注冊(cè)<b class='flag-5'>設(shè)備</b>的實(shí)現(xiàn)

    RT-Thread文檔_I2C 總線(xiàn)設(shè)備

    RT-Thread文檔_I2C 總線(xiàn)設(shè)備
    發(fā)表于 02-22 18:35 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>I2C</b> 總線(xiàn)<b class='flag-5'>設(shè)備</b>

    淺析RT-Thread設(shè)備驅(qū)動(dòng)框架

    RT-Thread 設(shè)備框架屬于組件和服務(wù)層,是基于 RT-Thread 內(nèi)核之上的上層軟件。設(shè)備框架
    的頭像 發(fā)表于 08-07 15:39 ?2338次閱讀

    基于 RT-Thread 的 RoboMaster 電控框架(一)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇
    的頭像 發(fā)表于 09-19 19:55 ?1036次閱讀

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例

    一、概述(一)RT-Thread設(shè)備驅(qū)動(dòng)RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是
    的頭像 發(fā)表于 02-24 08:16 ?2344次閱讀
    《<b class='flag-5'>RT-Thread</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer<b class='flag-5'>設(shè)備</b>為例
    主站蜘蛛池模板: 天堂网中文 | 校园春色亚洲欧美 | 免费四影虎ww4hu10 | 国模私拍大尺度视频在线播放 | 色网站欧美| 在线天堂资源www中文在线 | 国产狂喷冒白浆免费视频 | 国产女人和拘做受视频免费 | 日本有色视频 | 爱爱视频天天看 | 天天干干干干 | 亚洲一区二区三区播放在线 | 五月天激情丁香 | 日本免费色 | 国产精品露脸脏话对白 | 天天射天天做 | 国产成人精品亚洲77美色 | 日本特黄在线观看免费 | 日本三级三级三级免费看 | 午夜视频在线观看免费观看在线观看 | 久操视频在线免费观看 | 1000部啪啪未满十八勿入 | 77788色淫网站免费观看 | 国产人成午夜免视频网站 | 男人操女人在线观看 | 午夜社区| 欧美精品人爱a欧美精品 | 中文天堂最新版在线精品 | 色色色爱| 手机在线视频观看 | 四虎色影院 | 手机看片福利盒子久久 | 亚洲区 欧美区 | 国产一二三区精品 | 亚洲婷婷综合中文字幕第一页 | 国语对白一区二区三区 | 色综合成人 | 女同性进行性行为视频 | 美女毛片视频 | 中文字幕一区2区3区 | 精品黄色片 |