LoRa终端设备ASR6505之I2C通信
时间:2022-07-25
本文章向大家介绍LoRa终端设备ASR6505之I2C通信,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言:I2C接口是比较常见的接口,尤其是各种传感器,本篇聊聊ASR6505的I2C使用。
1、ASR6505的I2C接口
只有1路I2C,与STM8是相对应的。两个引脚PC0(I2C_SDA)和PC1(I2C_SCL)是开漏输出的,开发板中的H4针脚,需要外接上拉电阻。开发板上已经接了4.7K的上拉电阻。本例程以一个I2C设备(BM1383AGLV是一个压力和温度二合一的传感器)读写的展开。
2、接线
ASR6505 BM1383AGLV
VCC VCC
GND GND
PC0 SDA
PC1 SCL
3、STM8L关于I2C的操作
使用STM8L标准库函数,硬件I2C。主要还是起始信号、结束信号、ACK、NACK等的操作。
4、实验设计
间隔5s读取BM1383AGLV的数据,计算出当前压力和温度,并通过串口打印。
5、程序实现
关于I2C通用代码:
//初始化I2C外设
void I2C_PeriphInit(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
I2C_DeInit(I2C1);
I2C_Init(I2C1, 100000, BM1383AGLV_I2C_ADDR, I2C_Mode_I2C, I2C_DutyCycle_2,I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
I2C_Cmd(I2C1, ENABLE);
}
//从特定的寄存器读取数据
void I2C_ReadRegNByte(uint8_t reg,uint8_t num,uint8_t *datbuf)
{
uint8_t totalread=0;
totalread=num;
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);//起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress(I2C1, BM1383AGLV_I2C_ADDR, I2C_Direction_Transmitter);//写地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待ack
I2C_SendData(I2C1, (uint8_t)(reg));
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待ack
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, BM1383AGLV_I2C_ADDR, I2C_Direction_Receiver);//读地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//等待ack
while(num)
{
if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)) //测试EV6
{
datbuf[totalread-num]=I2C_ReceiveData(I2C1); //取一个字节
if(num == 1) //读到最后一个字节
{
I2C_AcknowledgeConfig(I2C1,DISABLE); //不需要应答
I2C_GenerateSTOP(I2C1,ENABLE); //发结束位
}
else
{
I2C_AcknowledgeConfig(I2C1,ENABLE); //不是最后一个字节向从设备发送应答信号
}
num--;
}
}
}
//写数据
void I2C_WriteRegByte(uint8_t Reg,uint8_t Data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);//起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));// EV5,主模式
I2C_Send7bitAddress(I2C1, BM1383AGLV_I2C_ADDR, I2C_Direction_Transmitter);//写地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待ack
I2C_SendData(I2C1, (uint8_t)Reg);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));//等待ack
I2C_SendData(I2C1, (uint8_t)Data);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待ack
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
}
关于BM1383AGLV设备相关代码:
//检测设备是否存在
void BM1383AGLVCheck(void)
{
uint16_t chip_id;
I2C_ReadRegNByte(BM1383AGLV_ID1,2,(uint8_t*)(&chip_id));
printf("chip_id=0x%xrn",chip_id);
if(chip_id!=0xe032)
{
printf("Device is not exist!rn");
}
else
{
printf("Device is existrn!");
}
}
//BM1383AGL设备初始化
void BM1383AGLVInit(void)
{
I2C_WriteRegByte(BM1383AGLV_PWR_DOWN,ACTIVE); //设置芯片上电
DelayMs(5);//延时必须大于2ms
I2C_WriteRegByte(BM1383AGLV_RESET,MEASUREMENT_ACTIVE); //启动测量功能
I2C_WriteRegByte(BM1383AGLV_MODE_CONTROL,MODE_CONTINUOUS|DEFAULT_1|DRDY_PIN_DISABLE|AVE_NUM_8); //持续测量模式、每次测量8次、不使能DRDY引脚
}
//BM1383AGL读取数据
void BM1383AGLVRead(void)
{
uint32_t pressure_count=0;
uint8_t pressure_m , pressure_l,pressure_d;
float pressure;
uint32_t temperture_count=0;
uint8_t temperture_m , temperture_l;
float temperture;
uint8_t status;
do
{
I2C_ReadRegNByte(BM1383AGLV_STATUS,1,&status);
}
while((status&DATA_OUTPUT_AVAILABLE)!=DATA_OUTPUT_AVAILABLE);//等待当前测量完成
I2C_ReadRegNByte(BM1383AGLV_PRESSURE_MSB,1,&pressure_m);
I2C_ReadRegNByte(BM1383AGLV_PRESSURE_LSB,1,&pressure_l);
I2C_ReadRegNByte(BM1383AGLV_PRESSURE_DEC,1,&pressure_d);
pressure_d=pressure_d>>2;//高6位有效
pressure_count+=(pressure_m*16384ul);
pressure_count+=(pressure_l<<6);
pressure_count+=(pressure_d);
pressure=pressure_count/2048.0;
printf("Pressure:%.2f hParn",pressure);
I2C_ReadRegNByte(BM1383AGLV_TEMPERATURE_MSB,1,&temperture_m);
I2C_ReadRegNByte(BM1383AGLV_TEMPERATURE_LSB,1,&temperture_l);
temperture_count=temperture_m<<8;
temperture_count+=temperture_l;
temperture=temperture_count/32.0;
printf("Temperture:%f ℃rn",temperture);
}
主函数相关代码:
int main( void )
{
BoardInitMcu( );
BoardInitPeriph( );
printf("ASR6505 I2C demo test!rn");
I2C_PeriphInit();
BM1383AGLVCheck();
BM1383AGLVInit();
while(1)
{
BM1383AGLVRead();
printf("---------------------------------------rnrn");
Delay(5);
}
}
6、实验现象
- 古中国数学家的计算力真是惊人
- 基于Apache Spark机器学习的客户流失预测
- 数据库连接字符串的处理方法!加密解密连接字符串。
- ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI。
- 通过自定义ServiceHost实现对WCF的扩展[实例篇]
- 通过自定义ServiceHost实现对WCF的扩展[原理篇]
- python使用rsa库做公钥解密(网上别处找不到)
- 通过“四大行为”对WCF的扩展[原理篇]
- WCF客户端运行时架构体系详解[下篇]
- WCF客户端运行时架构体系详解[上篇]
- WCF服务端运行时架构体系详解[续篇]
- [WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
- [WCF-Discovery]服务如何能被”发现”
- 我的数据访问函数库的源代码(一)—— 共用部分
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- DFS&BFS - 52. N-Queens II
- DFS&BFS - 51. N-Queens
- maze - dfs
- DFS&BFS - 130. Surrounded Regions
- Tree - 145. Binary Tree Postorder Traversal
- Tree - 94. Binary Tree Inorder Traversal
- Tree - 144. Binary Tree Preorder Traversal
- grpc调用主要流程分析(一)
- Array - 42. Trapping Rain Water Hard
- Go modules 简介
- Spring事务的传播行为
- String - 71. Simplify Path
- 性能测试工具——wrk
- String - 67. Add Binary
- Math - 50. Pow(x, n)