hal库的基本函数 |
您所在的位置:网站首页 › bit定义的函数 › hal库的基本函数 |
IIC:
IIC一共有只有两个总线: 一条是双向的数据线SDA,一条是串行时钟线SCL 所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每一个设备都对应一个唯一的地址。 起始信号:SCL保持高电平,SDA由高电平变为低电平后,延时(>4.7us),SCL变为低电平。停止信号:SCL保持高电平。SDA由低电平变为高电平。IIC信号在数据传输过程中,当SCL=1高电平时,数据线SDA必须保持稳定状态,不允许有电平跳变,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 SCL=1时 数据线SDA的任何电平变换会看做是总线的起始信号或者停止信号。 也就是在IIC传输数据的过程中,SCL时钟线会频繁的转换电平,以保证数据的传输 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据, 应答信号:主机SCL拉高,读取从机SDA的电平,为低电平表示产生应答 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节; 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 时序操作: MCU先发送一个开始信号(START)启动总线 接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0) 等待应答信号(ACK) 发送数据的存储地址。24C02一共有256个字节的存储空间,地址从0x00~0xFF,想把数据存储>在哪个位置,此刻写的就是哪个地址。 发送要存储的数据第一字节、第二字节、…注意在写数据的过程中,E2PROM每个字节都会>回应一个“应答位0”,老告诉我们写E2PROM数据成功,如果没有回应答位,说明写入不成功。 发送结束信号(STOP)停止总线 注意: 在写数据的过程中,每成功写入一个字节,E2PROM存储空间的地址就会自动加1,当加到0xFF后,再写一个字节,地址就会溢出又变成0x00。 写数据的时候需要注意,E2PROM是先写到缓冲区,然后再“搬运到”到掉电非易失区。所以这个过程需要一定的时间,AT24C02这个过程是不超过5ms! 所以,当我们在写多个字节时,写入一个字节之后,再写入下一个字节之前,必须延时5ms才可以 IIC写函数 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); 1 功能:IIC写数据 参数: *hi2c 设置使用的是那个IIC 例:&hi2c2 DevAddress 写入的地址 设置写入数据的地址 例 0xA0 *pData 需要写入的数据 Size 要发送的字节数 Timeout 最大传输时间,超过传输时间将自动退出传输函数 IIC读函数 HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); 1 功能:IIC读一个字节 参数: *hi2c: 设置使用的是那个IIC 例:&hi2c2 DevAddress: 写入的地址 设置写入数据的地址 例 0xA0 *pDat:a 存储读取到的数据 Size: 发送的字节数 Timeout: 最大读取时间,超过时间将自动退出读取函数 举例: HAL_I2C_Master_Transmit(&hi2c1,0xA1,(uint8_t*)TxData,2,1000) ;; 1 发送两个字节数据 IIC写数据函数 HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); /* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */ 功能: IIC写多个数据 该函数适用于IIC外设里面还有子地址寄存器的设备,比方说E2PROM,除了设备地址,每个存储字节都有其对应的地址 参数: *hi2c: I2C设备号指针,设置使用的是那个IIC 例:&hi2c2 DevAddress: 从设备地址 从设备的IIC地址 例E2PROM的设备地址 0xA0 MemAddress: 从机寄存器地址 ,每写入一个字节数据,地址就会自动+1 MemAddSize: 从机寄存器地址字节长度 8位或16位 写入数据的字节类型 8位还是16位 I2C_MEMADD_SIZE_8BIT I2C_MEMADD_SIZE_16BIT 在stm32f1xx_hal_i2c.h中有定义 *pData: 需要写入的的数据的起始地址 Size: 传输数据的大小 多少个字节 Timeout: 最大读取时间,超过时间将自动退出函数 使用HAL_I2C_Mem_Write等于先使用HAL_I2C_Master_Transmit传输第一个寄存器地址,再用HAL_I2C_Master_Transmit传输写入第一个寄存器的数据。可以传输多个数据 void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data) { uint8_t TxData[2] = {REG_Address,REG_data}; while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,(uint8_t*)TxData,2,1000) != HAL_OK) { if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF) { Error_Handler(); } } } 在传输过程,寄存器地址和源数据地址是会自加的。 至于读函数也是如此,因此用HAL_I2C_Mem_Write和HAL_I2C_Mem_Read,来写读指定设备的指定寄存器数据是十分方便的,让设计过程省了好多步骤。 HAL_I2C_Mem_Write(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000); HAL_I2C_Mem_Read(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000);
HAL_I2C_Mem_Write(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_16BIT,&(I2C_Buffer_Write[i]),8, 1000); HAL_I2C_Mem_Read(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_16BIT,&(I2C_Buffer_Write[i]),8, 1000); |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |