【联盛德W806上手笔记】七、I2C

目录

  • WM_SDK_W806_v0.6.0的库函数
    • 函数
    • 参数
    • 应用示例
      • 初始化
      • 使用
      • 测试
  • I2C 控制器
    • 功能概述
    • 主要特性
    • 功能描述
      • 传输速率选择
      • 中断及启动停止可控
      • 快速输出及检测信号
    • 寄存器描述
      • 寄存器列表
      • 时钟分频寄存器_1
      • 时钟分频寄存器_2
      • 控制寄存器
      • 数据寄存器
      • 收发控制寄存器
      • TXR 读出寄存器
      • CR 读出寄存器
  • iosetting大佬 维护的wm-sdk-w806
    • 函数
    • 参数
    • 应用示例
      • 初始化
      • 引脚复用
      • 使用
    • 测试

Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0


       摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》

WM_SDK_W806_v0.6.0的库函数

我们打开wm_i2c.h,有如下的函数声明:

函数

HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
//用于配置所用I2C的引脚HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
//将初始化之后的I2C引脚恢复成默认的状态–各个寄存器复位时的值HAL_StatusTypeDef HAL_I2C_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint8_t MemAddress, uint8_t *pData, uint16_t Size);
//用于向从器件某地址写入数据HAL_StatusTypeDef HAL_I2C_Read(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint8_t MemAddress, uint8_t *pData, uint16_t Size);
//用于由从器件某地址读取数据

参数

结构体和枚举类型

typedef struct
{GPIO_TypeDef *SCL_Port;uint32_t SCL_Pin;GPIO_TypeDef *SDA_Port;uint32_t SDA_Pin;
} I2C_HandleTypeDef;

(看着是不是有点怪

#define I2C_SDA_H(HANDLE)	HAL_GPIO_WritePin(HANDLE->SDA_Port, HANDLE->SDA_Pin, GPIO_PIN_SET)#define I2C_SDA_L(HANDLE)	HAL_GPIO_WritePin(HANDLE->SDA_Port, HANDLE->SDA_Pin, GPIO_PIN_RESET)#define I2C_SCL_H(HANDLE)	HAL_GPIO_WritePin(HANDLE->SCL_Port, HANDLE->SCL_Pin, GPIO_PIN_SET)#define I2C_SCL_L(HANDLE)	HAL_GPIO_WritePin(HANDLE->SCL_Port, HANDLE->SCL_Pin, GPIO_PIN_RESET)#define I2C_SDA_OUT(HANDLE)	SET_BIT(HANDLE->SDA_Port->DIR, HANDLE->SDA_Pin)#define I2C_SDA_IN(HANDLE)	CLEAR_BIT(HANDLE->SDA_Port->DIR, HANDLE->SDA_Pin)#define I2C_SDA_GET(HANDLE)	HAL_GPIO_ReadPin(HANDLE->SDA_Port, HANDLE->SDA_Pin)

应用示例

初始化

I2C_HandleTypeDef hi2c;
//...
static void I2C_Init(void);
//...
static void I2C_Init(void)
{hi2c.SCL_Port = GPIOA;hi2c.SCL_Pin = GPIO_PIN_1;hi2c.SDA_Port = GPIOA;hi2c.SDA_Pin = GPIO_PIN_4;HAL_I2C_Init(&hi2c);
}

使用

    I2C_Init();//...HAL_I2C_Write(&hi2c, DEVICE_ADDR, 地址, 数据缓冲区首地址, 数据长度);//...HAL_I2C_Read(&hi2c, DEVICE_ADDR, 地址, 数据缓冲区首地址, 数据长度)

测试

这里用的测试程序见【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们再打开wm_i2c.c:
在这里插入图片描述
可以看到 WM_SDK_W806_v0.6.0 库函数里i2c的实现竟然是模拟i2c
在这里插入图片描述
但在数据手册中是有硬件i2c相关的描述的:

I2C 控制器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

功能概述

       I2C 总线是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
       主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

主要特性

APB 总线协议标准接口
只可作为主设备控制器使用
I2C 工作速率可配,100KHz~400KHz
多路 GPIO 可复用成 I2C 的通信接口
可快速输出和检测时序信号

功能描述

传输速率选择

       通过设置寄存器 PRERlo 和寄存器 PRERhi 就可以将 I2C 总线上的数据传输速率配置在 100KHz 到400KHz 之间的任意总线频率整数分频值。

中断及启动停止可控

       通过设置寄存器 CTR 的 Bit6 允许或者禁止 I2C 控制器产生中断,并且还可以通过设置 Bit7 来随时启动或者停止 I2C 控制器的工作。

快速输出及检测信号

       通过设置寄存器 CR_SR 的相应位可以使控制器快速输出或者检测总线 START 信号,总线 STOP 信号,总线 ACK 信号,总线 NACK 信号。在主模式下,I2C 接口启动数据传输并生成时钟信号。 一个串行数据传输始终以启动信号开始,以停止信号结束。一旦在总线上生成启动信号,就选择了主设备模式。

寄存器描述

寄存器列表

在这里插入图片描述
在这里插入图片描述

时钟分频寄存器_1

在这里插入图片描述

时钟分频寄存器_2

在这里插入图片描述
在这里插入图片描述

控制寄存器

在这里插入图片描述

数据寄存器

在这里插入图片描述
在这里插入图片描述

收发控制寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TXR 读出寄存器

在这里插入图片描述

CR 读出寄存器

在这里插入图片描述

iosetting大佬 维护的wm-sdk-w806

IOsetting的CSDN主页

git clone https://gitee.com/iosetting/wm-sdk-w806.git

可以看到,已有硬件I2C的实现:
在这里插入图片描述
打开wm_i2c.h,有如下声明:

函数

HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
//用于配置I2C接口的引脚、速率、优先级等HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
//将初始化之后的I2C接口恢复成默认的状态–各个寄存器复位时的值void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);
//用于启用I2C时钟,选择复用引脚void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);
//用于禁用I2C时钟,将对应引脚恢复成默认的状态HAL_StatusTypeDef HAL_I2C_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint8_t MemAddress, uint8_t *pData, uint16_t Size);
//用于向从器件某地址写入数据HAL_StatusTypeDef HAL_I2C_Read(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint8_t MemAddress, uint8_t *pData, uint16_t Size);
//用于由从器件某地址读取数据

参数

结构体和枚举类型

typedef struct __I2C_HandleTypeDef
{I2C_TypeDef                 *Instance;      /*!< I2C registers base address               */uint32_t                    Frequency;HAL_LockTypeDef             Lock;           /*!< Object lock                              */__IO uint32_t               ErrorCode;      /*!< I2C Error code                           */
} I2C_HandleTypeDef;

宏参数

#define I2C                             ((I2C_TypeDef *)I2C_BASE)

应用示例

初始化

I2C_HandleTypeDef hi2c;
#define DEVICE_ADDR    0xA0 //八位地址static void I2C_Init(void);
static void GPIO_Init(void);//...static void I2C_Init(void)
{hi2c.Instance = I2C;hi2c.Frequency = 400000;HAL_I2C_Init(&hi2c);
}static void GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIO_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

引脚复用

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{__HAL_RCC_I2C_CLK_ENABLE();__HAL_AFIO_REMAP_I2C_SCL(GPIOA, GPIO_PIN_1);__HAL_AFIO_REMAP_I2C_SDA(GPIOA, GPIO_PIN_4);
}void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{__HAL_RCC_I2C_CLK_DISABLE();HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1);HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);
}

使用

    GPIO_Init();I2C_Init();//...HAL_I2C_Write(&hi2c, DEVICE_ADDR, 地址, 数据缓冲区首地址, 数据长度);//...HAL_I2C_Read(&hi2c, DEVICE_ADDR, 地址, 数据缓冲区首地址, 数据长度)

测试

经过一晚上的测试,我发现两个引脚存在互相干扰的现象,已经严重影响正常通讯(原因暂时未知)
在这里插入图片描述
即使是使用 iosetting大佬的OLED Demo(见联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏 —— IOsetting),我也只在通讯速率为1MHz下能跑通:
在这里插入图片描述在这里插入图片描述

尽管我已在运行Demo前事先延时5s以跳过电平不稳定阶段:
在这里插入图片描述

但在其他速率下仍难以通讯
400kHz:
在这里插入图片描述
在这里插入图片描述
100kHz:此情况下为完全黑屏
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【联盛德W806上手笔记】八、SPI及其DMA

目录高速 SPI 设备控制器库函数函数参数宏应用示例初始化引脚复用中断相关使用注意事项DataAlignmentDirection测试main.cwm_hal_msp.cwm_it.c其他改动实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书…

安装配置 radicale

为什么80%的码农都做不了架构师&#xff1f;>>> 可以直接pip安装,也可以下载源码安装,如果要存储到sql里面,则需要下载源码包,用里面的schema.sql 建表 默认安装后没有相应的配置文件,源码包里面也包含了 logging 和config,放到/etc/radicale 下 安装没什么说的,下…

【联盛德W806上手笔记】九、DMA

目录DMA 控制器功能概述功能描述DMA 通道DMA 数据流DMA 循环模式DMA 传输模式DMA 外设选择DMA 链表模式DMA 中断中断请求库函数函数参数宏应用Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》 DMA 控制…

SNF快速开发平台MVC-自由排序组件

1. 自由排序功能使用 在一些需要排序优先级的数据进行调整处理&#xff0c;如民族数据&#xff0c;在北方实施的时候汉族比较多&#xff0c;希望把汉族放在第一位。在蒙古实施项目时&#xff0c;蒙古族人最多把蒙古族放在第一选择位。 1.1. 效果展示 图 1.1 1.2. …

【联盛德W806上手笔记】十、ADC

目录ADCADC 电路设计库函数函数参数宏Demo中的例程main.cwm_hal_msp.cwm_it.cWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 ADC 基于 Sigma-Delta ADC 的采集模块&#xff0c;集成 4 路 16 比特 AD…

【电路补习笔记】8、稳压电路 —— 线性电源及LDO

目录有名的电源芯片品牌DCDC电源分类开关电源vs线性稳压器线性电源参数线性电源工作原理集成稳压器78/79系列&#xff08;固定输出电压&#xff09;正、负对称输出两组电源的稳压电路扩展输出电压扩大输出电流LM317/LM337&#xff08;可调输出电压&#xff09;正、负对称输出两…

ajax代码整理

$.ajax({ type: "post", 【以POST或GET的方式请求。默认GET。PUT和DELETE也可以用&#xff0c;有的浏览器不支持】 url: url, 【请求的目的地址&#xff0c;须是一个字符串。】 contentType: "application/json", 【以哪种数据类型发送请求】 data: data, …

创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像&#xff0c;我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单&#xff0c;但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说&#xff0c;这个例子将带领你正式进入WCF的世界。 在这个例…

深圳IO —— 一个汇编编程小游戏

目录简介数据手册接口简单 I/OXBus简单 I/O 对比 XBus语言参考程序结构注释标签寄存器accdatp0、p1、x0、x1、x2、x3null 伪寄存器指令操作数确保进行足够的睡眠 (slp)&#xff01;基本指令算法指令条件指令隐藏指令游戏界面DIY版本&#xff1a; 简介 以下介绍摘自未来软件园 …

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了&#xff0c;今天看文档时刚巧看到了&#xff0c;就来尝试了一下。 效果如图&#xff1a; shader 的编辑器扩展分为2种方法&#xff1a; 是通过UnityEditor下的ShaderGUI类来实现的&#xff0c;形式比较近似于我们一般对unity编辑器的扩展方式。是通…

【电路补习笔记】9、电容式开关电源(电荷泵)

目录分类原理电荷泵基础开关电容稳压器的细调功能电荷泵的电压增益调节输出电容&#xff08;Co&#xff09;优点电容式开关稳压器减小纹波相关应用老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a; 电源大师3——电容式开关电源&#xff08;电荷泵&#xff09;工作原理…

CPU 硬盘性能到底相差多少

本文以一个现代的、实际的个人电脑为对象&#xff0c;分析其中CPU&#xff08;Intel Core 2 Duo 3.0GHz&#xff09;以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度&#xff0c;希望能给大家留下一个比较直观的印象。本文中的数据来自…

【电路补习笔记】10、电感式开关电源(BUCK 降压电路)

目录分类封装焊线式覆晶式开关电源三种基本的非隔离开关电源纹波&#xff08;ripple&#xff09;开关电源的元件构成有源开关肖特基二极管或快恢复二极管不使用普通硅二极管的原因电感电容分压电阻&#xff08;输出电压设置&#xff09;工作原理工作模式连续模式&#xff08;co…

php中Session的生成机制、回收机制和存储机制探究

转载:http://www.jb51.net/article/53938.htm这篇文章主要介绍了php中Session的生成机制、回收机制和存储机制探究,可以帮助大家对Session有一个全面的了解,需要的朋友可以参考下1、php中session的生成机制我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是…

wsl2 Ubuntu 18.04 安装 ROS

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU&#xff1a;WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

GPU CUDA 经典入门指南

转自&#xff1a;http://luofl1992.is-programmer.com/posts/38830.html CUDA编程中&#xff0c;习惯称CPU为Host&#xff0c;GPU为Device。编程中最开始接触的东西恐怕是并行架构&#xff0c;诸如Grid、Block的区别会让人一头雾水&#xff0c;我所看的书上所讲述的内容比较抽象…

用PyQt实现透明桌面时钟小部件

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding: utf-8 -*-Created on 2012-4-6author: wangxiaoimport sys from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt from PyQt4.QtCore import QPoint from PyQt4.QtCore…

实现织梦dedecms百度主动推送(实时)网页抓取

做百度推广的时候&#xff0c;如何让百度快速收录呢&#xff0c;下面提供了三种方式&#xff0c;今天我们主要讲的是第一种。 如何选择链接提交方式 1、主动推送&#xff1a;最为快速的提交方式&#xff0c;推荐您将站点当天新产出链接立即通过此方式推送给百度&#xff0c;以保…

【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录GPIOpython3python-peripherypython2RPiC语言SysFs方式编写gpiolib.cgpiolib.hmain.c编译测试wiringPibash平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 GPIO (机翻)下表显示了座子的引脚&am…

Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

目录python3开始学习Python线程_thread常量和函数&#xff1a;锁对象试用基本功能试用线程同步threading函数常量类线程本地数据线程对象锁对象递归锁对象条件对象信号量对象Semaphore 例子事件对象定时器对象栅栏对象在 with 语句中使用锁、条件和信号量测试Cstd::threadstd::…