日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nrf52 iic使用

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nrf52 iic使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、使用環境

SDK17.1 ble_app_template例程

二、工程配置

2.1 添加官方驅動文件

2.2 使能TWI

三、代碼移植

驅動代碼 peripheral_iic.h

#ifndef _PERIPHERAL_I2C_H_ #define _PERIPHERAL_I2C_H_#include "boards.h" #include "nrf_delay.h" #include "nrf_drv_twi.h" #include "nrf_gpio.h"#include <stdio.h> #include <string.h>bool I2C_register_read(uint8_t slave_address, uint8_t register_address, uint8_t *destination, uint8_t number_of_bytes); bool I2C_register_write(uint8_t slave_address, unsigned char *data_buf, uint8_t len);int16_t I2C_Write_Reg(unsigned char i2c_add, unsigned char reg_add, unsigned char cmd); int16_t I2C_Read_Reg(unsigned char i2c_add, unsigned char reg_add, unsigned char *ucData);int16_t I2C_MultiWrite_Reg(unsigned char i2c_add, unsigned char reg_add, int16_t num, unsigned char *ucData); int16_t I2C_MultiRead_Reg(unsigned char i2c_add, unsigned char reg_add, int16_t num, unsigned char *ucData);void I2C_init(void); void I2C_uninit(void);#endif // END _PERIPHERAL_I2C_H_

驅動代碼 peripheral_iic.c

#include "peripheral_iic.h"// TWI驅動程序實例ID,ID和外設編號對應,0:TWI0 1:TWI1 #define TWI_INSTANCE_ID_S 0 // TWI傳輸完成標志 static volatile bool I2C_xfer_done = false;//定義TWI驅動程序實例,名稱為m_twi static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID_S);// TWI事件處理函數 static void twi_s_handler(nrf_drv_twi_evt_t const *p_event, void *p_context) {//判斷TWI事件類型switch (p_event->type){//傳輸完成事件case NRF_DRV_TWI_EVT_DONE:I2C_xfer_done = true; //置位傳輸完成標志break;default:break;} }/************************************************************************** 功 能 : 寫I2C_Slave寄存器* 參 數 : register_address[in]:寄存器地址* : value[in]:寫入的數據* 返回值 : true:寫數據成功,false:寫入失敗*************************************************************************/ bool I2C_register_write(uint8_t slave_address, unsigned char *data_buf, uint8_t len) {uint8_t timeOut = 0;ret_code_t err_code;// TWI傳輸完成標志設置為falseI2C_xfer_done = false;//寫入數據err_code = nrf_drv_twi_tx(&m_twi, slave_address, data_buf, len, false);//等待TWI總線傳輸完成timeOut = 0;while (I2C_xfer_done == false){if (timeOut > 50){return false;}else{timeOut++;}nrf_delay_us(100);}if (NRF_SUCCESS != err_code){return false;}return true; }/************************************************************************** 功 能 : 讀I2C_Slave寄存器* 參 數 : register_address[in]:寄存器地址* : * destination[out] :指向保存讀取數據的緩存* : number_of_bytes[in] :讀取的數據長度* 返回值 : true:操作成功,false:操作失敗*************************************************************************/ bool I2C_register_read(uint8_t slave_address, uint8_t register_address, uint8_t *destination, uint8_t number_of_bytes) {uint8_t timeOut = 0;ret_code_t err_code;// TWI傳輸完成標志設置為falseI2C_xfer_done = false;err_code = nrf_drv_twi_tx(&m_twi, slave_address, &register_address, 1, true);//等待TWI總線傳輸完成timeOut = 0;while (I2C_xfer_done == false){if (timeOut > 50){return false;}else{timeOut++;}nrf_delay_us(100);}if (NRF_SUCCESS != err_code){return false;}// TWI傳輸完成標志設置為falseI2C_xfer_done = false;err_code = nrf_drv_twi_rx(&m_twi, slave_address, destination, number_of_bytes);//等待TWI總線傳輸完成timeOut = 0;while (I2C_xfer_done == false){if (timeOut > 50){return false;}else{timeOut++;}nrf_delay_us(100);}if (NRF_SUCCESS != err_code){return false;}return true; }int16_t I2C_Write_Reg(unsigned char i2c_add, unsigned char reg_add, unsigned char cmd) {uint8_t BufTmp[2];BufTmp[0] = reg_add;BufTmp[1] = cmd;return I2C_register_write(i2c_add, BufTmp, 2); }int16_t I2C_Read_Reg(unsigned char i2c_add, unsigned char reg_add, unsigned char *ucData) {return I2C_register_read(i2c_add, reg_add, ucData, 1); }int16_t I2C_MultiWrite_Reg(unsigned char i2c_add, unsigned char reg_add, int16_t num, unsigned char *ucData) {uint8_t BufTmp[num + 1];BufTmp[0] = reg_add;memcpy(&BufTmp[1], ucData, num);return I2C_register_write(i2c_add, BufTmp, num + 1); }int16_t I2C_MultiRead_Reg(unsigned char i2c_add, unsigned char reg_add, int16_t num, unsigned char *ucData) {return I2C_register_read(i2c_add, reg_add, ucData, num); }void I2C_init(void) { ret_code_t err_code;//定義并初始化TWI配置結構體const nrf_drv_twi_config_t twi_config_s = {.scl = ARDUINO_SCL_PIN, //定義TWI SCL引腳.sda = ARDUINO_SDA_PIN, //定義TWI SDA引腳.frequency = NRF_DRV_TWI_FREQ_400K, // TWI速率.interrupt_priority = APP_IRQ_PRIORITY_HIGHEST, // TWI優先級.clear_bus_init = false //初始化期間不發送9個SCL時鐘};//初始化TWIerr_code = nrf_drv_twi_init(&m_twi, &twi_config_s, twi_s_handler, NULL);//檢查返回的錯誤代碼APP_ERROR_CHECK(err_code);//使能TWInrf_drv_twi_enable(&m_twi); }void I2C_uninit(void) {//失能TWInrf_drv_twi_disable(&m_twi);nrf_drv_twi_uninit(&m_twi);nrf_gpio_cfg_default(ARDUINO_SDA_PIN);nrf_gpio_cfg_default(ARDUINO_SCL_PIN); }

添加我們的驅動文件和頭文件路徑,然后使用例子。

四、驅動測試

4.1 添加頭文件
#include "peripheral_iic.h"
4.2 簡單讀寫測試
#define LIS2MDL_ADDR_WRITE 0x3C//0x3C 0x1EU #define LIS2MDL_ADDR_READ 0x3D//0x3D 0x1EU/* 設備寄存器地址 */ #define LIS2MDL_ADDR_CFGA 0x60 #define LIS2MDL_ADDR_CFGB 0x61 #define LIS2MDL_ADDR_CFGC 0x62 #define LIS2MDL_ADDR_INTCRTL 0x63 #define LIS2MDL_ADDR_INTSOURCE 0x64 #define LIS2MDL_ADDR_INTTHSL 0x65 #define LIS2MDL_ADDR_INTTHSH 0x66 #define LIS2MDL_ADDR_STATUS 0x67#define LIS2MDL_ADDR_XOUTL 0x68 #define LIS2MDL_ADDR_XOUTH 0x69 #define LIS2MDL_ADDR_YOUTHL 0x6A #define LIS2MDL_ADDR_YOUTH 0x6B #define LIS2MDL_ADDR_ZOUTL 0x6C #define LIS2MDL_ADDR_ZOUTH 0x6Dvoid i2c_test(void) {unsigned char writeData = 0x47;unsigned char readData = 0;I2C_init();I2C_MultiWrite_Reg(LIS2MDL_ADDR_WRITE, LIS2MDL_ADDR_CFGA, 1, &writeData);I2C_MultiRead_Reg(LIS2MDL_ADDR_READ, LIS2MDL_ADDR_XOUTL, 1, &readData); }

總結

以上是生活随笔為你收集整理的nrf52 iic使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。