STM32F030中I2C 的配置和 AT24C16驱动
- 格式:doc
- 大小:30.00 KB
- 文档页数:5


STM32配置IIC接口通信方式参考源码```c#include "stm32f10x.h"GPIO_InitTypeDef GPIO_InitStruct;I2C_InitTypeDef I2C_InitStruct;void I2C_Configuration(void)/* Step 1: Initialize I2C peripheral */I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // I2C mode I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // I2C duty cycleI2C_InitStruct.I2C_OwnAddress1 = 0x00; // I2C own addressI2C_InitStruct.I2C_Ack = I2C_Ack_Enable; // I2C Acknowledgement enableI2C_InitStruct.I2C_AcknowledgedAddress =I2C_AcknowledgedAddress_7bit; // I2C acknowledged address mode /* Step 2: Initialize GPIO for I2C */GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 , GPIO_Pin_7; // GPIO pins connected to I2C peripheralGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; // GPIO mode for I2CGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // GPIO speed/* Step 3: Enable GPIO and I2C peripheral clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // Enables the clock for Alternate FunctionRCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // Enables the clock for I2C1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Enables the clock for GPIOB/* Step 4: Configure GPIO */GPIO_Init(GPIOB, &GPIO_InitStruct);/* Step 5: Initialize I2C */I2C_Init(I2C1, &I2C_InitStruct);I2C_Cmd(I2C1, ENABLE); // Enable I2C1 peripheralvoid I2C_WriteData(uint8_t deviceAddress, uint8_t regAddress, uint8_t data)/* Step 1: Generate a START condition */I2C_GenerateSTART(I2C1, ENABLE);/* Step 2: Wait for START condition to be generated */while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/* Step 3: Send the device address and wait for acknowledgement */I2C_Send7bitAddress(I2C1, deviceAddress,I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/* Step 4: Send the register address and wait for acknowledgement */I2C_SendData(I2C1, regAddress);while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* Step 5: Send the data and wait for acknowledgement */I2C_SendData(I2C1, data);while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* Step 6: Generate a STOP condition */I2C_GenerateSTOP(I2C1, ENABLE);uint8_t I2C_ReadData(uint8_t deviceAddress, uint8_t regAddress)uint8_t data;/* Step 1: Generate a START condition */I2C_GenerateSTART(I2C1, ENABLE);/* Step 2: Wait for START condition to be generated */while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/* Step 3: Send the device address and wait for acknowledgement */I2C_Send7bitAddress(I2C1, deviceAddress,I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/* Step 4: Send the register address and wait for acknowledgement */I2C_Cmd(I2C1, ENABLE);I2C_SendData(I2C1, regAddress);while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* Step 5: Generate a RESTART condition */I2C_GenerateSTART(I2C1, ENABLE);/* Step 6: Wait for RESTART condition to be generated */while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/* Step 7: Send the device address and wait for acknowledgement */I2C_Send7bitAddress(I2C1, deviceAddress,I2C_Direction_Receiver);while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));/* Step 8: Enable Acknowledgement */I2C_AcknowledgeConfig(I2C1, ENABLE);/* Step 9: Disable Acknowledgement */data = I2C_ReceiveData(I2C1);I2C_AcknowledgeConfig(I2C1, DISABLE);/* Step 10: Generate a STOP condition */I2C_GenerateSTOP(I2C1, ENABLE);return data;int main(void)/* Step 1: Initialize I2C */I2C_Configuration(;/* Step 2: Write data to I2C device */I2C_WriteData(0xA0, 0x00, 0x01);/* Step 3: Read data from I2C device */uint8_t data = I2C_ReadData(0xA0, 0x00);/* Step 4: Loop forever */while (1);return 0;```以上是一个简单的STM32配置IIC接口通信方式的参考源码。
高手经验!STM32单片机学习I2C通信
I2C总线是由NXP(原PHILIPS)公司设计,有十分简洁的物理层定义,其特性如下:
- 只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;
- 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
- 它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
- 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
- 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
其典型的接口连线如下:
I2C的协议很简单:
数据的有效性。
stm32 i2c 读写波形在STM32微控制器中,I2C是一种非常常用的通信协议,用于连接多个设备进行数据传输。
本文将重点讨论STM32的I2C读写波形,以及如何正确进行I2C通信。
I2C(Inter-Integrated Circuit)是一种串行通信协议,由Philips公司在1980年代开发。
它使用两根信号线(串行数据线SDA和串行时钟线SCL),允许多个设备在同一总线上通信。
每个设备都有一个唯一的地址,通过地址可以识别和选择特定的设备进行通信。
对于STM32微控制器来说,I2C通信是通过硬件模块来实现的。
通常,我们首先需要配置I2C的时钟频率和引脚,然后才能进行I2C通信。
下面以一个简单的例子来说明I2C读写波形。
假设我们要将数据发送给一个I2C设备,并读取其返回的数据。
首先,我们需要初始化I2C的时钟和引脚设置。
然后,我们可以启动I2C总线并发送设备的地址。
接下来,我们可以发送要传输的数据。
最后,我们可以停止I2C总线,完成数据传输。
在I2C通信中,数据是以字节的形式传输的。
每个字节的传输都包括一个起始位、8位数据、一个应答位和一个停止位。
起始位和停止位都是逻辑高电平的信号,用来表示传输的开始和结束。
数据传输是基于时钟信号的上升沿和下降沿来实现的。
在STM32的I2C读写波形中,我们可以清晰地看到起始位、停止位和数据位的变化。
起始位和停止位之间有8个数据位,每个数据位的传输都在时钟信号的控制下进行。
当数据传输完成后,设备可以发送一个应答信号,表示数据的接收状态。
通过观察I2C读写波形,我们可以判断数据的传输是否正常。
如果传输过程中出现因为硬件故障或者软件错误导致的波形异常,数据可能无法正确读取或写入。
为了保证I2C通信的可靠性和稳定性,我们可以根据具体实际情况进行一些优化。
例如,可以调整I2C的时钟频率,根据设备的要求选择合适的传输速率。
同时,我们还可以加入适当的延时,以确保I2C 总线上的数据稳定。
STM32F103模拟IIC在⽤STM32F103模拟IIC时,SDA的配置很有意思,既要读数据,⼜要写数据,这两者之间的切换通过GPIO的配置寄存器来实现。
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}就是这两句话,GPIO配置寄存器分为端⼝配置低寄存器(GPIOx_CRL) (x=A..E)和端⼝配置⾼寄存器(GPIOx_CRH)(x=A..E);在这⾥⽤到的是PB7模拟IIC的SDA,所以切换配置时,先将原配置清零,GPIOB->CRL&=0X0FFFFFFF;再重新配置,GPIOB->CRL|=8<<28;附上STM32F1参考⼿册和程序源码IIC.cvoid BSP_IIC_InitConfig(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // 端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO⼝速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOIIC_SCL_H;IIC_SDA_H;}#define IIC_DELAY_4 IIC_Delay(10) //4US#define IIC_DELAY_1 IIC_Delay(10) //4US//1US#define IIC_DELAY_2 IIC_Delay(10) //4US//2US//产⽣IIC起始信号void IIC_Start(void){SDA_OUT(); //sda线输出IIC_SDA_H;IIC_SCL_H;IIC_DELAY_4;IIC_SDA_L;//START:when CLK is high,DATA change form high to lowIIC_DELAY_4;IIC_SCL_L;//钳住I2C总线,准备发送或接收数据}//产⽣IIC停⽌信号void IIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL_L;IIC_SDA_L;//STOP:when CLK is high DATA change form low to highIIC_DELAY_4;IIC_SCL_H;IIC_SDA_H;//发送I2C总线结束信号IIC_DELAY_4;}//等待应答信号到来//返回值:1,接收应答失败// 0,接收应答成功u8 IIC_Wait_Ack(void){u8 ucErrTime=0;SDA_IN(); //SDA设置为输⼊IIC_SDA_H;IIC_DELAY_1;IIC_SCL_H;IIC_DELAY_1;while(IIC_SDA_Read){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL_L;//时钟输出0return 0;}//产⽣ACK应答void IIC_Ack(void){IIC_SCL_L;SDA_OUT();IIC_SDA_L;IIC_DELAY_2;IIC_SCL_H;IIC_DELAY_2;IIC_SCL_L;}//不产⽣ACK应答void IIC_NAck(void){IIC_SCL_L;SDA_OUT();IIC_SDA_H;IIC_DELAY_2;IIC_SCL_H;IIC_DELAY_2;IIC_SCL_L;}//IIC发送⼀个字节//返回从机有⽆应答//1,有应答//0,⽆应答void IIC_Send_Byte(u8 txd){u8 t;SDA_OUT();IIC_SCL_L;//拉低时钟开始数据传输for(t=0;t<8;t++){if ((txd&0x80)>>7)IIC_SDA_H;elseIIC_SDA_L;txd<<=1;IIC_DELAY_2; //对TEA5767这三个延时都是必须的 IIC_SCL_H;IIC_DELAY_2;IIC_SCL_L;IIC_DELAY_2;}}//读1个字节,ack=1时,发送ACK,ack=0,发送nACKu8 IIC_Read_Byte(unsigned char ack){unsigned char i,receive=0;SDA_IN();//SDA设置为输⼊for(i=0;i<8;i++ ){IIC_SCL_L;IIC_DELAY_2;IIC_SCL_H;receive<<=1;if(IIC_SDA_Read)receive++;IIC_DELAY_1;}if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACKreturn receive;}//1 失败//0 成功u8 IIC_WriteData(u8 dev_addr,u8 reg_addr,u8 data){IIC_Start();IIC_Send_Byte(dev_addr);if (IIC_Wait_Ack())return 1;IIC_Send_Byte(reg_addr);if (IIC_Wait_Ack())return 1;IIC_Send_Byte(data);if (IIC_Wait_Ack())return 1;IIC_Stop();return 0;}//1 失败//0 成功u8 IIC_ReadData(u8 dev_addr,u8 reg_addr,u8 *pdata,u8 count) {u8 i;IIC_Start();IIC_Send_Byte(dev_addr);if (IIC_Wait_Ack())return 1;IIC_Send_Byte(reg_addr);if (IIC_Wait_Ack())return 1;IIC_Start();IIC_Send_Byte(dev_addr+1);if (IIC_Wait_Ack())return 1;for(i=0;i<(count-1);i++){*pdata=IIC_Read_Byte(1);pdata++;}*pdata=IIC_Read_Byte(1);IIC_Stop();return 0;}//⽤于us级延时void IIC_Delay(u32 time){while(time--);}IIC.h#define IIC_SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_6)#define IIC_SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_6)#define IIC_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_7)#define IIC_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_7)#define IIC_SDA_Read GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)//IO⽅向设置#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;} #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;} //IIC所有操作函数void IIC_Init(void); //初始化IIC的IO⼝void IIC_Start(void); //发送IIC开始信号void IIC_Stop(void); //发送IIC停⽌信号void IIC_Send_Byte(u8 txd); //IIC发送⼀个字节u8 IIC_Read_Byte(unsigned char ack);//IIC读取⼀个字节u8 IIC_Wait_Ack(void); //IIC等待ACK信号void IIC_Ack(void); //IIC发送ACK信号void IIC_NAck(void); //IIC不发送ACK信号void IIC_Delay(u32 time);void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);u8 IIC_Read_One_Byte(u8 daddr,u8 addr);u8 IIC_WriteData(u8 dev_addr,u8 reg_addr,u8 data);u8 IIC_ReadData(u8 dev_addr,u8 reg_addr,u8 *pdata,u8 count);。