bes2300之i2c(七)

news/2025/1/15 12:38:05/

sdk中i2c的接口相关都在hal_i2c中,提供的i2c的模式也有很多种,包括硬件,io口模拟,状态机管理方式等等(I2C_SIMPLE_MODE,I2C_TASK_MODE,I2C_SENSOR_ENGINE),这里我主要说说io口模拟的方式,适用通讯数据量比较小的处理,比如配置外设的寄存器等。

app_i2c_demo.c

#include "app_i2c_demo.h"
#include "hal_i2c.h"
#include "hal_iomux.h"
#include "hal_trace.h"
#include "cmsis_os.h"
#include "hal_timer.h"typedef struct _app_i2c_demo_reg_config {uint8_t reg;uint8_t value;uint8_t delay;/* 配置下一个寄存器的间隔,目前的单位是ms,考虑到有些外设在配置完某个寄存器之后,需要等一段时间才能配置下一个寄存器的情况 */
}app_i2c_demo_reg_config;/* 七位地址 */
#define APP_I2C_DEMO_ADDR           0x10
/* 八位地址 */
#define APP_I2C_DEMO_WRITE_ADDR     0x20
#define APP_I2C_DEMO_READ_ADDR      0x21
#define ARRAY_DIM(a) (sizeof(a) / sizeof((a)[0]))/* 这个是我外设的寄存器组,注意每组的第三个是delay时间,如果不需要delay配置为0即可 */
const static app_i2c_demo_reg_config app_i2c_demo_config_table[] =
{{0x0e,  0x01,   0x00},{0x15,  0xe9,   0x00},{0x0a,  0x00,   0x00},{0x0e,  0x01,   0x00},{0x04,  0x40,   0x00},{0x0f,  0x00,   0x00},{0x10,  0x03,   0x00},{0x11,  0x00,   0x00},{0x12,  0x5f,   0x00},{0x03,  0x04,   0x00},{0x0b,  0x10,   0x00},{0x0c,  0x10,   0x00},{0x13,  0x00,   0x00},{0x26,  0x02,   0x00},{0x27,  0xc0,   0x00},{0x05,  0x44,   0x00},{0x07,  0x21,   0x00},{0x0d,  0x74,   0x00},{0x00,  0x01,   0x02},{0x00,  0x03,   0x00},{0x01,  0x01,   0x07},{0x01,  0x31,   0x01},{0x02,  0x01,   0x00},{0x01,  0x33,   0x05},{0x03,  0x07,   0x00},};static void app_delay_ms(u16 delay_ms)
{hal_sys_timer_delay_us(delay_ms*1000);
}/* 这个是我封装的i2c读写接口 */
uint32_t app_demo_i2c_demo_transfer(uint32_t device_addr, uint8_t *tx_buf, uint32_t tx_len, uint8_t *rx_buf, uint32_t rx_len)
{if(!rx_buf || !rx_len) {hal_gpio_i2c_simple_send(device_addr, tx_buf, tx_len);} else {hal_gpio_i2c_simple_recv(device_addr, tx_buf, tx_len, rx_buf, rx_len);}return 0;
}/*i2c读写测试*/
void app_i2c_demo_test(void)
{uint16_t table_length = ARRAY_DIM(app_i2c_demo_config_table);uint16_t index = 0;uint8_t packet[2];uint8_t reg;const app_i2c_demo_reg_config *p_tab = app_i2c_demo_config_table;TRACE(0,"%s", __func__);for(index = 0; index < table_length; index++) {packet[0] = p_tab[index].reg;packet[1] = p_tab[index].value;app_demo_i2c_demo_transfer(APP_I2C_DEMO_ADDR, packet, 2, NULL, 0);if(p_tab[index].delay)app_delay_ms(p_tab[index].delay);}index = 0;for(index = 0; index < table_length; index++) {reg = p_tab[index].reg;app_demo_i2c_demo_transfer(APP_I2C_DEMO_ADDR, &reg, 1, &packet[0], 1);TRACE(0,"%s value2=%02x", __func__, packet[0]);}
}/* 这里是以pio20和pio21分别做scl和sda*/
static const HAL_GPIO_I2C_CONFIG_T app_i2c_demo_config =
{(enum HAL_GPIO_PIN_T)HAL_IOMUX_PIN_P2_0,(enum HAL_GPIO_PIN_T)HAL_IOMUX_PIN_P2_1,0,
};int app_i2c_demo_init(void)
{hal_gpio_i2c_open(&app_i2c_demo_config);app_i2c_demo_test();return 0;
}

app_i2c_demo.h

#ifndef __APP_I2C_DEMO_H__
#define __APP_I2C_DEMO_H__
#include "cmsis_os.h"uint32_t app_demo_i2c_demo_transfer(uint32_t device_addr, uint8_t *tx_buf, uint32_t tx_len, uint8_t *rx_buf, uint32_t rx_len);
int app_i2c_demo_init(void);#endif

注意使用模拟i2c的时候,可能需要根据具体的ic规格书去修改通讯中的一些时间间隔,如下所示(定义在hal_i2c中),单位是us

 

 

 

相关资料请到<bes2300开发调试笔记>文章底部的网盘链接中下载!


http://www.ppmy.cn/news/158509.html

相关文章

抓包和网络镜像 华为交换机S2300

配置镜像 用户在eth 0/0/2 观察口在eth 0/0/1 &#xff1a; 从0/0/1 去抓 0/0/2的内容 配置观察口参数 全局视图下 observing-port 1 interface Ethernet0/0/1配置需要抓包的端口 在相应的端口下 #进入端口 interface Ethernet0/0/2 #配置需要转包的参数 #oubound 为端口转…

BES2300Z USB mode 讲解

hello&#xff0c;在BES的蓝牙中有一些芯片是支持USB mode&#xff1b;在使用的过程中&#xff0c;在BT mode 和 USB mode 中只能有一种模式存在。 排版会有点乱&#xff0c;请谅解。 下面来讲解下BES2300Z 在USB mode 下打开的方法、遇到的一些问题等 首先在打开USB mode时需…

练习1(华为交换机忘记console口密码)

忘记console口密码重置&#xff1a; 1、使用console口连接交换机后&#xff0c;重启交换机。&#xff08;华为交换机的密码一般默认都是admin&#xff0c;也有可能是用户名是huawei&#xff0c;密码是admin&#xff0c;或是huawei123。&#xff09; 2、当出现页面命令行时&am…

Problem 2300 IoU

http://acm.fzu.edu.cn/problem.php?pid2300 不用计算几何&#xff0c;要仔细观察&#xff0c;贪心即可。 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; int main() {int t;cin>>t;while(t--){ll x1,y1,w1,h1;ll x2,…

bes2300开发调试笔记

记录学习过程以及遇到的问题&#xff01; 持续看心情更新~ bes2300之环境搭建&#xff08;一&#xff09;bes2300之按键配置&#xff08;二&#xff09;bes2300之led配置&#xff08;三&#xff09;bes2300之prompt配置&#xff08;四&#xff09;bes2300之RTX介绍及简单运用…

BES2300YP - SPI接口

目录 GPIO Pin Mux Pin Mux相关的代码 Hal_spi.c/h的几组api hal_iomux_set_spilcd 我的测试代码 GPIO Pin Mux SPI的调试需要考虑GPIO的选择和复用设定, 最开始的时候我拿到的是GPIO Pin Mux的Excel, 整理如下: 后面的研究发现这里有坑 Pin Mux相关的代码 hal_iomux_…

在K8s上部署Redis 集群

一、前言 架构原理&#xff1a;每个Master都可以拥有多个Slave。当Master下线后&#xff0c;Redis集群会从多个Slave中选举出一个新的Master作为替代&#xff0c;而旧Master重新上线后变成新Master的Slave。 二、准备操作 本次部署主要基于该项目&#xff1a; https://github…

华为交换机,登录密码忘记

华为Quidway S2326TP-SI&#xff0c;忘记console登录密码 解决&#xff1a;进入BOOTROM清除原登录密码&#xff0c;然后重设新密码。&#xff08;BOOTROM是存储设备启动程序和文件的存储器&#xff09; Step1&#xff1a;重启交换机&#xff0c;按CRTLB进入BOOTROM 输入BOOT…