一、IIC简介
IIC即Inter-IntegratedCircuit(集成电路总线),是一种多向控制总线,由飞利浦半导体公司在八十年代初设计,主要是用来连接整体电路(ICS)。在IIC中,多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源,这种方式简化了信号传输总线。
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件:
当SCL保持“高”时,SDA由“高”变为“低”为开始条件;
当SCL保持“高”且SDA由“低”变为“高”时为停止条件。
开始和停止条件均由主控制器产生。使用硬件接口可以很容易地检测到开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样,以检测这种变化。
二、修改工程函数
1、main.c
int main(void)
{
u32 CT_data[2]={
0};
volatile float c1=0,t1=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
temphum_init();
delay_ms(40);//刚上电,延时40ms才可以读取状态
if(!((AHT20_Read_Status()&0x08)==0x08))//首先发0x71读取状态字bit[3],如果=1,为校准输出,无须初始化!!! 正常情况下读回来的状态是0x1C或者是0x18,读回来是0x80表示忙状态;
{
AHT20_Init(); //初始化AHT20
}
while(1)
{
//DisableIrq(); //由于是模拟I2C,为读取数据更准确 ,读取之前禁止中断;
delay_ms(1000);
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次
//AHT20_Read_CTdata_crc(CT_data); //crc校验后,读取AHT20的温度和湿度数据
c1 = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
//printf("%d %d\r\n",*CT_data,*(CT_data+1));
LED=0;
delay_ms(500);
LED=1;
printf("湿度:%.1f%%\r\n",(c1/10));
printf("温度:%.1f℃\r\n",(t1/10));
printf("\r\n");
delay_ms(500);
}
}
2、myiic.c
#include "myiic.h"
#include "delay.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK精英STM32开发板
//IIC驱动 代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/9
//版本:V1.0
//版权所有,盗版必究。