国产W806 I2C硬件模块
根据PDF资料描述,没有想到还是翻车了,改芯片PDF描述简直精简的需要靠猜测来编程,翻看官方提供的I2C都是软件模拟发送(至少我没有找到硬件的),也许软件模拟的I2C更有灵魂!
先看最终效果,这里我读取的是LTC4151 模块
虽然经过计算400KHz的时钟,但是逻辑分析仪读出始终偏小;
//#define I2C_BASE (HR_APB_BASE_ADDR + 0x0000)
//
//typedef struct
//{
// __IOM uint32_t PRESCALE_L;
// __IOM uint32_t PRESCALE_H;//4
// __IOM uint32_t CTR;//8
// __IOM uint32_t TXR_RXR;//c
// __IOM uint32_t CR_SR;//10
// __IM uint32_t TXR;
// __IM uint32_t CR;
//} I2C_TypeDef;#define i2cReg ((I2C_TypeDef*)I2C_BASE)
void Soc_i2cInit(void)
{__HAL_RCC_I2C_CLK_ENABLE();__HAL_AFIO_REMAP_I2C_SCL(GPIOA,GPIO_PIN_1);__HAL_AFIO_REMAP_I2C_SDA(GPIOA,GPIO_PIN_4);uint32_t i2cClk =400;//设置时钟:400Khzuint32_t prescale=(40*1000)/(5*i2cClk)-1 ;//= 16’d19i2cReg->PRESCALE_L =prescale&0xff;i2cReg->PRESCALE_H =(prescale>>8)&0xff;i2cReg->CTR =(1UL<<7);//使能i2c
}#define I2C_Stop(){i2cReg->CR_SR=(1UL<<6);}
//向I2c 写入一个字节
//uint8_t haddr,硬件地址
//uint8_t cmd,软件地址,16bit需要修改
//uint8_t data,写入数据
//return 不等于0 失败
int I2C_Write_Byte(uint8_t haddr,uint8_t cmd,uint8_t data )
{int err =-1;uint8_t datas[3] ={haddr&0xfe,cmd,data};uint8_t start =(1UL<<7);for(int i=0;i<3;i++){i2cReg->TXR_RXR =datas[i];i2cReg->CR_SR=(1UL<<4)|(1UL<<0)|start;//写入开始、清空中断start=0;while((i2cReg->CR_SR&(1UL<<0))==0){;}//等待完成if((i2cReg->CR_SR&(1UL<<7))!=0){//判断设备响应goto exit;} }err =0;
exit:I2C_Stop();//发送停止
return err;
}
//i2C连续读取寄存器
//uint8_t haddr :硬件地址
//uint8_t cmd:软件地址,8位,16bit需要修改
//uint8_t *data:接收地址
//int blen:读取字节数
//return 不等于0 失败
int I2C_Read_Byte(uint8_t haddr ,uint8_t cmd,uint8_t *data,int blen)
{int err =-1;uint8_t datas[3] ={haddr&0xfe,cmd,haddr|1};uint8_t start =0;for(int i=0;i<3;i++){i2cReg->TXR_RXR =datas[i];//装载数据start=(i==1)?0:(1UL<<7);//硬件地址需要发送开始i2cReg->CR_SR=(1UL<<4)|(1UL<<0)|start;//写入开始、清空中断while((i2cReg->CR_SR&(1UL<<0))==0){;}//等待完成if((i2cReg->CR_SR&(1UL<<7))!=0){//判断设备响应goto exit;} }start=0;while(blen--){if(blen==0){start=(1UL<<3);//NACK}i2cReg->CR_SR=(1UL<<5)|(1UL<<0)|start;//读取+开始,清空中断while((i2cReg->CR_SR&(1UL<<0))==0){;}//等待完成*data++ =i2cReg->TXR_RXR;//接收数据}err =0;
exit:I2C_Stop();//发送停止
return err;
}int main(void)
{uint8_t data[16];xSoc_i2cInit();do{int ret =I2C_Read_Byte(0xde,0,data,8);}while(0);
return 0;
}
国产W806 I2C硬件模块相关推荐
- STM32’s I2C 硬件BUG引发的血案
2010-4-8 1: 45 下面的函数中有一个BUG, 也就是SR2不能用WHILE来轮询,而应直接读出.如下面代码段,因此,在这里说的这是STM32的BUG其实是我的代码的错误: I2C2 ...
- STM32’s I2C 硬件BUG引发的血案(qzm)
2010-4-8 1: 45 下面的函数中有一个BUG, 也就是SR2不能用WHILE来轮询,而应直接读出.如下面代码段, 因此,在这里说的这是STM32的BUG其实是我的代码的错误: I2C ...
- 基于STC8G2K64S4单片机通过I2C硬件控制OLED屏幕
#前言 本文主要是讲解了如何使用STC8G2K64S4单片机自带I2C硬件来控制OLED屏幕 写这篇文章主要是为了之后的模拟量光敏调节参数,使参数直接显示在OLED屏幕中更方便调节 在刚学习之时,查遍 ...
- 基于I2C硬件协议的AHT20温湿度传感器的数据采集
基于I2C的温湿度采集 硬件I2C和软件I2C 温湿度采集 任务要求 硬件连接 添加代码 最终效果 硬件I2C和软件I2C 硬件I2C对应芯片上的baiI2C外设,有相应I2C驱动电路,其所使用的I2 ...
- HDLBits答案(6)_硬件模块设计的思考方式
硬件模块设计的思考方式 HDLBits链接 基本的逻辑门操作 题目描述1:将输入端口in和输出端口out连接. Solution1: module top_module (input in,outpu ...
- 无线联网功能硬件模块无法拆除的计算机禁止,2021年保密知识竞赛抢答题库及答案(共120题).docx...
2021年保密知识竞赛抢答题库及答案(共120题) 1 涉密计算机不得安装使用无线键盘.无线鼠标.蓝牙.红外和无线网卡.答案:正确2 涉密便携式计算机应当拆除具有无线联网功能的硬件模块.答案:正确3 ...
- 《STM32从零开始学习历程》——I2C向EEPROM写入一字节数据(I2C硬件)
<STM32从零开始学习历程>@EnzoReventon I2C向EEPROM写入一字节数据(I2C硬件) 相关链接: I2C物理层介绍 I2C协议层介绍 I2C固件库介绍 STM32的I ...
- linux优化网页加载过程,【zz】Linux起步过程中硬件模块的加载
[zz]Linux起步过程中硬件模块的加载 [zz]Linux起步过程中硬件模块的加载 日期:2014-05-16 浏览次数:20354 次 [zz]Linux启动过程中硬件模块的加载 文章来源不详. ...
- 拆机观察自己电脑中的各个硬件模块
目标 最近有需求要运送或邮寄自己的台式机,可能需要拆掉一些部件分开运送.这对于我来说还有些困难,因为我在硬件方面的知识很少,没有自己从零开始装过机.我担心自己拆完之后装不回来... 因此,我想提前进行 ...
最新文章
- 三星电池正在获取使用模式_三星Galaxy S10系列超大电池持久动力,解决电量烦恼...
- DeepMind网红博士300页论文出炉:面向NLP的神经迁移学习
- Javascript prototype理解
- 为什么static成员必须在类外初始化
- python-tkinter模块图形分布移动(可键盘操作)
- 使用TestContainers进行数据库测试
- 【Kafka】docker下kafka报错 IOException: Connection to xxx:19093 (id: 1002 rack: null) failed
- 苹果手机投屏软件_苹果手机怎么投屏到电脑上?支你一招
- kernal tch 下载 天正_【T20天正插件下载】T20天正插件最新版 v5.0 官方版-开心电玩...
- python 使用前馈神经网络处理IrIs数据集(BP)
- steam链接社区_如何通过Steam链接上的Xbox One控制器启用振动
- POI2000 病毒
- [转]机器视觉代码大全
- 自适应情侣纪念日记录网站源码
- 步步学习自定义View:Hencoder 精简版学习笔记(一)
- SSM+社区线上超市购物系统毕业设计-附源码211704
- Java mail 535鉴权失败或启动报错
- jquery操作样式
- 使用unity3d制作像素鸟游戏
- 整顿职场,从 ROC 曲线开始