STM32 IIC协议
Posted qifeng1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 IIC协议相关的知识,希望对你有一定的参考价值。
※ IIC有两条线 时钟线SCL/数据线SDA
※ 速率: 普通模式:100k bit/s
快速模式:400k bit/s
高速模式:3.4M bit/s
※ 一个主机 n个从机
※ 发送到SDA数据线上每个字节为8位 高位在前
※ 8位数据后跟着一个答应位ACK
-----------------------------------------------------------------------------------------发送和读取响应信号------------------------------------------------------------------------------------------
1 /* 2 函数功能:主机发送应答信号 3 参数说明:待发送的应答信号 0有应答 1非应答 4 */ 5 void IICSendAck(u8 ack) 6 7 IIC_SCL=0; 8 if(ack)//主机准备数据 9 IIC_SDA_OUT=1; 10 else 11 IIC_SDA_OUT=0; 12 Delayus(2);//延时(数据稳定在数据线上) 13 IIC_SCL=1;//(从机在时钟线上升沿从SDA上采集数据) 14 Delayus(1);//延时(给时间从机读取数据) 15
1 /* 2 函数功能:主机读取从机的应答信号 3 返回值:读取到的应答信号 0有应答 1非应答 4 */ 5 u8 IICReadAck(void) 6 7 u8 ack=0; 8 9 IIC_SCL=0;//(从机准备数据) 10 IIC_SDA_OUT=1;//读模式,为了是IO口的输出电路给引脚断开!!!!!!!!! 11 Delayus(2);//延时(给时间从机准备数据并且数据稳定在数据线上) 12 IIC_SCL=1; 13 Delayus(1);//延时 (给时间主机读取数据) 14 if(IIC_SDA_IN)//主机读取SDA线上的数据 15 ack=1; 16 17 IIC_SCL=0;//为了方便后续操作,防止意外出现停止条件 18 19 return ack; 20
-----------------------------------------------------------------------------------------起始位和停止位发送------------------------------------------------------------------------------------------
1 /* 2 起始条件 3 */ 4 void IICStart(void) 5 6 IIC_SCL=1; 7 IIC_SDA_OUT=1; 8 Delayus(2);//延时--起始条件建立时间 9 IIC_SDA_OUT=0; 10 Delayus(1);//延时--起始条件保持时间 11 IIC_SCL=0; //---一个完整的周期 12 13 14 15 /* 16 停止条件 17 */ 18 void IICStop(void) 19 20 IIC_SCL=0; 21 IIC_SDA_OUT=0; 22 IIC_SCL=1; 23 Delayus(1);//延时--停止条件的建立时间 24 IIC_SDA_OUT=1; 25 Delayus(2);//延时--本次停止到下一开始的时间 26
----------------------------------------------------------------------写一个字节/写入某地址某寄存器一个字节-----------------------------------------------------------------------------
1 /* 2 函数功能:主机给从机发送一个字节数据并且读取从机应答 3 参数说明:待发送的一个字节数据 4 返回值:应答信号 5 */ 6 u8 IICSendByte(u8 data) 7 8 u8 i; 9 10 for(i=0;i<8;i++) 11 12 IIC_SCL=0; 13 if((data<<i)&0x80)//主机准备数据 14 IIC_SDA_OUT=1; 15 else 16 IIC_SDA_OUT=0; 17 Delayus(2);//延时(数据稳定在数据线上) 18 IIC_SCL=1;//(从机在时钟线上升沿从SDA上采集数据) 19 Delayus(1);//延时(给时间从机读取数据) 20 21 22 IIC_SCL=0;//为了方便后续操作,防止意外出现停止条件 23 24 return IICReadAck( ); 25
1 /* 2 函数功能:写寄存器 3 参数说明:regaddr寄存器地址 data写入的值 4 */ 5 u8 MPR121WriteDate(u8 regaddr,u8 data) 6 7 8 IICStart( ); 9 10 if( IICSendByte(MPR121ADDR_W) ) 11 12 IICStop(); 13 printf("1111111111111\\r\\n"); 14 return 0xFF; 15 16 17 if( IICSendByte(regaddr) ) 18 19 IICStop(); 20 printf("222222222222\\r\\n"); 21 return 0xFF; 22 23 24 if( IICSendByte(data) ) 25 26 IICStop(); 27 printf("3333333333333\\r\\n"); 28 return 0xFF; 29 30 31 IICStop(); 32 33 return 0; 34
----------------------------------------------------------------------读取个字节/读取某地址某寄存器一个字节-----------------------------------------------------------------------------
1 /* 2 函数功能:主机读取从机一个字节数据并且发送应答信号 3 参数说明:待发送的应答信号 4 返回值:读取到的一个字节数据 5 */ 6 u8 IICReadByte(u8 ack) 7 8 u8 i; 9 u8 data=0; 10 11 for(i=0;i<8;i++) 12 13 IIC_SCL=0;//(从机准备数据) 14 IIC_SDA_OUT=1;//读模式,为了是IO口的输出电路给引脚断开!!!!!!!!! 15 Delayus(2);//延时(给时间从机准备数据并且数据稳定在数据线上) 16 IIC_SCL=1; 17 Delayus(1);//延时 (给时间主机读取数据) 18 data<<=1;//空出最低位 19 if(IIC_SDA_IN)//主机读取SDA线上的数据 20 data |=1; 21 22 23 IIC_SCL=0;//为了方便后续操作,防止意外出现停止条件 24 25 IICSendAck(ack); 26 27 return data; 28
1 /* 2 函数功能:读寄存器 3 参数说明:regaddr寄存器地址 4 返回值:读到的值 5 */ 6 u8 MPR121ReadDate(u8 regaddr) 7 8 IICStart( ); 9 10 if( IICSendByte(MPR121ADDR_W) ) 11 12 IICStop(); 13 return 0; 14 15 16 if( IICSendByte(regaddr) ) 17 18 IICStop(); 19 return 0; 20 21 22 IICStart( ); 23 if( IICSendByte(MPR121ADDR_R) ) 24 25 IICStop(); 26 return 0; 27 28 29 return IICReadByte(1) ; 30 31
以上是关于STM32 IIC协议的主要内容,如果未能解决你的问题,请参考以下文章
STM32使用IIC总线通讯协议在OLED屏幕上显示字符串汉字图像(硬件IIC)
STM32使用IIC总线通讯协议在OLED屏幕上显示字符串汉字温湿度(软件IIC)
STM32第七章: IIC(I2C Inter-Intergrated Circuit 集成电路总线) IIC时序图(IIC协议) I2C模拟时序STM32F4XX的IIC通信重载print