您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > IIC总线软件模拟stm32
IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。IIC总线时序图如下:#defineAT24C01127#defineAT24C02255#defineAT24C04511#defineAT24C081023#defineAT24C162047#defineAT24C324095#defineAT24C648191#defineAT24C12816383#defineAT24C25632767//MiniSTM32开发板使用的是24c02,所以定义EE_TYPE为AT24C02#defineEE_TYPEAT24C02//IO方向设置#defineSDA_IN(){GPIOC-CRH&=0XFFFF0FFF;GPIOC-CRH|=812;}#defineSDA_OUT(){GPIOC-CRH&=0XFFFF0FFF;GPIOC-CRH|=312;}//IO操作函数#defineIIC_SCLPCout(12)//SCL#defineIIC_SDAPCout(11)//SDA#defineREAD_SDAPCin(11)//输入SDA//初始化IICvoidIIC_Init(void){RCC-APB2ENR|=14;//先使能外设IOPORTC时钟GPIOC-CRH&=0XFFF00FFF;//PC11/12推挽输出GPIOC-CRH|=0X00033000;GPIOC-ODR|=311;//PC11,12输出高}//产生IIC起始信号voidIIC_Start(void){SDA_OUT();//sda线输出IIC_SDA=1;IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:whenCLKishigh,DATAchangeformhightolowdelay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据}//产生IIC停止信号voidIIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:whenCLKishighDATAchangeformlowtohighdelay_us(4);IIC_SCL=1;IIC_SDA=1;//发送I2C总线结束信号delay_us(4);}//等待应答信号到来//返回值:1,接收应答失败//0,接收应答成功u8IIC_Wait_Ack(void){u8ucErrTime=0;SDA_IN();//SDA设置为输入IIC_SDA=1;delay_us(1);IIC_SCL=1;delay_us(1);while(READ_SDA){ucErrTime++;if(ucErrTime250){IIC_Stop();return1;}}IIC_SCL=0;//时钟输出0return0;}//产生ACK应答voidIIC_Ack(void){IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;}//不产生ACK应答voidIIC_NAck(void){IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;}//IIC发送一个字节//返回从机有无应答//1,有应答//0,无应答voidIIC_Send_Byte(u8txd){u8t;SDA_OUT();IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t8;t++){IIC_SDA=(txd&0x80)7;txd=1;delay_us(2);//对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2);IIC_SCL=0;delay_us(2);}}//读1个字节,ack=1时,发送ACK,ack=0,发送nACKu8IIC_Read_Byte(unsignedcharack){unsignedchari,receive=0;SDA_IN();//SDA设置为输入for(i=0;i8;i++){IIC_SCL=0;delay_us(2);IIC_SCL=1;receive=1;if(READ_SDA)receive++;delay_us(1);}if(!ack)IIC_NAck();//发送nACKelseIIC_Ack();//发送ACKreturnreceive;}
本文标题:IIC总线软件模拟stm32
链接地址:https://www.777doc.com/doc-2878573 .html