当前位置: 首页 > news >正文

深圳网站开发语言营销型网站推广方案

深圳网站开发语言,营销型网站推广方案,怎样设网站,网站特效网江科大STM32学习记录 I2C通信 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线两根通信线:SCL(Serial Clock)、SDA(Serial Data)同步,半双工带数据应答支持总线挂载多设备…

江科大STM32学习记录

I2C通信

  • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
  • 同步,半双工
  • 带数据应答
  • 支持总线挂载多设备(一主多从、多主多从)
    硬件电路
  • 所有I2C设备的SCL连在一起,SDA连在一起
  • 设备的SCL和SDA均要配置成开漏输出模式
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
    在这里插入图片描述
  • *IIC的SCL和SDA要配置成开漏输出,开漏与弱上拉的模式

I2C时序基本单元

  • 起始条件:SCL高电平期间,SDA从高电平切换到低电平
  • 终止条件:SCL高电平期间,SDA从低电平切换到高电平
    在这里插入图片描述
void myIIC_Start(void)//SCL高电平期间,sda产生一个下升沿
{Set_SDA(1);Set_SCL(1);Set_SDA(0);Set_SCL(0);}void myIIC_Stop(void)//SCL高电平期间,sda产生一个上升沿
{Set_SCL(1);Set_SDA(0);Set_SDA(1);
}

I2C时序基本单元

  • 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
    在这里插入图片描述

void myIIC_SendByte(uint8_t Byte)//SCL低电平,主机把数据放到SDA线上,SCL高电平,从机读取SDA上的数据
{uint8_t i;for(i=0;i<8;i++){Set_SDA(Byte & (0x80>>i));Set_SCL(1);	Set_SCL(0);	}
}

I2C时序基本单元

  • 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
    在这里插入图片描述

uint8_t myIIC_ReceByte(void)//SCL低电平,从机把数据放到SDA线上,SCL高电平,主机读取SDA上的数据
{uint8_t Rece_Byte = 0x00;uint8_t i;Set_SDA(1);//释放sda总线for(i=0;i<8;i++){Set_SCL(1);if(Read_SDA() == 1){Rece_Byte |= (0x80 >> i);}Set_SCL(0);	}return Rece_Byte;}

  • 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
  • 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
    在这里插入图片描述
void myIIC_SendACK(uint8_t AckBit)
{Set_SDA(AckBit);Set_SCL(1);	Set_SCL(0);	
}uint8_t myIIC_ReceACK(void)
{uint8_t AckBit;Set_SDA(1);//释放sda总线Set_SCL(1);AckBit = Read_SDA();Set_SCL(0);	return AckBit;
}

I2C时序

  • 指定地址写
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
    在这里插入图片描述
    发送的第一个字节为从机地址加读写位,高七位为从机地址,最低位为读写位(0表示要写入;1表示要读出)
void Specify_Address_Write(uint8_t Slave,uint8_t RegAddress,uint8_t Data)
{myIIC_Start();myIIC_SendByte(Slave);myIIC_ReceACK();myIIC_SendByte(RegAddress);myIIC_ReceACK();myIIC_SendByte(Data);myIIC_ReceACK();myIIC_Stop();}

  • 当前地址读
  • 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
    在这里插入图片描述

  • 指定地址读
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
    在这里插入图片描述
uint8_t Specify_Address_Read(uint8_t Slave,uint8_t RegAddress)
{uint8_t temp;myIIC_Start();myIIC_SendByte(Slave);myIIC_ReceACK();myIIC_SendByte(RegAddress);myIIC_ReceACK();
//上面为指定地址myIIC_Start();//重复起始myIIC_SendByte(Slave | 0x01);//低位1表示读操作myIIC_ReceACK();temp = myIIC_ReceByte();myIIC_SendACK(1);//不应答myIIC_Stop();return temp;

MPU6050简介

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
    在这里插入图片描述
    MPU6050参数
  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
  • 加速度计满量程选择:±2、±4、±8、±16(g)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
  • 可配置的数字低通滤波器
  • 可配置的时钟源
  • 可配置的采样分频
  • I2C从机地址:1101000(AD0=0) 1101001(AD0=1)

硬件电路
在这里插入图片描述
在这里插入图片描述

MPU6050框图
在这里插入图片描述
案例:获取xyz加速度值和陀螺仪值

#include "MPU6050.h"void MPU6050_Init(void)
{myIIC_Init();Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_1,0x01);Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_2,0x00);Specify_Address_Write(MPU6050_Address,MPU6050_SMPLRT_DIV,0x09);Specify_Address_Write(MPU6050_Address,MPU6050_CONFIG,0x06);Specify_Address_Write(MPU6050_Address,MPU6050_GYRO_CONFIG,0x18);Specify_Address_Write(MPU6050_Address,MPU6050_ACCEL_CONFIG,0x18);}uint8_t MCU6050_GetID(void)
{return Specify_Address_Read(MPU6050_Address,MPU6050_WHO_AM_I);}void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t data_H;uint8_t data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_L);*AccX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_L);*AccY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_L);*AccZ = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_L);*GyroX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_L);*GyroY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_L);*GyroZ = (data_H<<8) | data_L;}
#ifndef _MPU6050_H
#define _MPU6050_H
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "myIIC.h"
#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75
#define	MPU6050_Address		0xD0void MPU6050_Init(void);
uint8_t MCU6050_GetID(void);
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);#endif

硬件I2C通信

  • STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
  • 支持多主机模型
  • 支持7位/10位地址模式
  • 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
  • 支持DMA
  • 兼容SMBus协议
  • STM32F103C8T6 硬件I2C资源:I2C1、I2C2

I2C框图
在这里插入图片描述
I2C基本结构
在这里插入图片描述
主机发送
在这里插入图片描述

//超时退出机制uint8_t Check_Timeout(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{uint32_t time = 5000;while(I2C_CheckEvent(I2Cx,I2C_EVENT) != SUCCESS){time -- ;if(time == 0){return Timeout;}}return SUCCESS;
}void Specify_Address_Write(uint8_t Slave,uint8_t RegAddress,uint8_t Data)
{I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING);I2C_SendData(I2C2,Data);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTOP(I2C2,ENABLE);}

主机接收
在这里插入图片描述

uint8_t Specify_Address_Read(uint8_t Slave,uint8_t RegAddress)
{uint8_t ReceData;I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Receiver);Check_Timeout(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);I2C_AcknowledgeConfig(I2C2,DISABLE);I2C_GenerateSTOP(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED);ReceData = I2C_ReceiveData(I2C2);I2C_AcknowledgeConfig(I2C2,ENABLE);return ReceData;
}

软件/硬件波形对比
在这里插入图片描述
硬件I2C相关寄存器
在这里插入图片描述

硬件I2C读取MPU6050数据

#include "I2C.h"void I2C_init(void)
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//复用开漏模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed  =  GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);I2C_InitTypeDef I2C_InitStructure;I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//指定I2C模式。I2C_InitStructure.I2C_ClockSpeed = 200000;//指定时钟频率I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//作为从机地址为7位I2C_InitStructure.I2C_OwnAddress1 = 0x00;//作为从机自身地址I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//指定I2C快速模式占空比I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_Init(I2C2,&I2C_InitStructure);I2C_Cmd(I2C2,ENABLE);}//超时退出机制uint8_t Check_Timeout(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{uint32_t time = 5000;while(I2C_CheckEvent(I2Cx,I2C_EVENT) != SUCCESS){time -- ;if(time == 0){return Timeout;}}return SUCCESS;
}void Specify_Address_Write(uint8_t Slave,uint8_t RegAddress,uint8_t Data)
{I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING);I2C_SendData(I2C2,Data);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTOP(I2C2,ENABLE);}uint8_t Specify_Address_Read(uint8_t Slave,uint8_t RegAddress)
{uint8_t ReceData;I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Receiver);Check_Timeout(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);//接收的最后一个字节之前就要不应答和发送终止信号I2C_AcknowledgeConfig(I2C2,DISABLE);I2C_GenerateSTOP(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED);//接收到事件后一个字节就传到DR寄存器了ReceData = I2C_ReceiveData(I2C2);I2C_AcknowledgeConfig(I2C2,ENABLE);return ReceData;
}void MPU6050_Init(void)
{I2C_init();Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_1,0x01);Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_2,0x00);Specify_Address_Write(MPU6050_Address,MPU6050_SMPLRT_DIV,0x09);Specify_Address_Write(MPU6050_Address,MPU6050_CONFIG,0x06);Specify_Address_Write(MPU6050_Address,MPU6050_GYRO_CONFIG,0x18);Specify_Address_Write(MPU6050_Address,MPU6050_ACCEL_CONFIG,0x18);}
uint8_t MCU6050_GetID(void)
{return Specify_Address_Read(MPU6050_Address,MPU6050_WHO_AM_I);}void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t data_H;uint8_t data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_L);*AccX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_L);*AccY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_L);*AccZ = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_L);*GyroX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_L);*GyroY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_L);*GyroZ = (data_H<<8) | data_L;}
http://www.yayakq.cn/news/934012/

相关文章:

  • 莱芜区宣传部网站网站的优化公司
  • 西宁网站优化电商网站销售数据分析
  • 网站开发吃香吗支付网站开发费分录
  • 长春科技网站建设专业做轴承的网站
  • 十里河网站建设公司彩钢做网站能赚钱吗
  • 做机械一般做那个外贸网站南宁seo关键词排名
  • ps切片以后 怎么做网站成都百度推广电话号码
  • 深圳网站建设可以吗电子商务网站建设实训总结
  • 保定建行网站首页登录网站开发服务合同模板
  • 网站被黑 禁止js跳转行业网站推广
  • 网站更换标题网站建设在线商城
  • 设计找图网站深圳市住房和建设局办事大厅
  • 同安区建设局网站为什么做民宿网站
  • 办个网站卖什么好处网站建设 紧急检查工作
  • 韩国的汽车设计网站十大网站免费
  • 做定制商品的网站网页设计薪资多少
  • 邯郸大名网站建设网站收录作用
  • wordpress绑定域名自动优化网站建设电话
  • 怎样做网站的签约设计师门户网站的大数据应用
  • 现代网站开发建设刚刚上海突然宣布
  • 河北廊坊做网站运营实力 网站建设
  • net网站开发的步骤txtwordpress单页淘客源码
  • 网站建设自查自评报告怎么查询网站的建站时间
  • 拼多多网站建设合同湘潭网站建设问下磐石网络
  • 申请网站需要什么资料苏州网站建设风兰
  • 网页设计网站源代码wordpress 插件扫描
  • 网站建设毕业设计的分类号个人网站制作wordpress
  • 关于拳馆网站建设计划书网站 制作 技术过时
  • 深圳网站设计公司哪个好无尺码精品产品
  • 平台网站制作房山富阳网站建设