STM32F103使用IIC访问AT24C02

以下为示例代码,完整代码,在文章末尾获取。

/*******************************************************************************
* 函 数 名         : AT24CXX_Init
* 函数功能		   : AT24CXX初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void AT24CXX_Init(void)
{
	IIC_Init();//IIC初始化
}

/*******************************************************************************
* 函 数 名         : AT24CXX_ReadOneByte
* 函数功能		   : 在AT24CXX指定地址读出一个数据
* 输    入         : ReadAddr:开始读数的地址 
* 输    出         : 读到的数据
*******************************************************************************/
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{				  
	u8 temp=0;		  	    																 
    IIC_Start();  
	if(EE_TYPE>AT24C16)
	{
		IIC_Send_Byte(0XA0);	   //发送写命令
		IIC_Wait_Ack();
		IIC_Send_Byte(ReadAddr>>8);//发送高地址	    
	}
	else 
	{
		IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据
	} 	   
	IIC_Wait_Ack(); 
  IIC_Send_Byte(ReadAddr%256);   //发送低地址
	IIC_Wait_Ack();	    
	IIC_Start();  	 	   
	IIC_Send_Byte(0XA1);           //进入接收模式			   
	IIC_Wait_Ack();	 
    temp=IIC_Read_Byte(0);		   
    IIC_Stop();//产生一个停止条件	    
	return temp;
}

完整代码地址: https://download.csdn.net/download/weixin_32093149/54689754

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103可以通过硬件I2C接口读写24C02芯片。 步骤如下: 1. 配置I2C接口:设置I2C时钟频率、I2C地址、I2C模式等参数。 2. 发送起始信号:向I2C总线发送起始信号。 3. 发送设备地址:向24C02芯片发送设备地址,包括读写位。 4. 发送数据地址:向24C02芯片发送要读写的数据地址。 5. 发送数据:向24C02芯片发送要写入的数据,或者从24C02芯片读取数据。 6. 发送停止信号:向I2C总线发送停止信号。 具体实现可以参考STM32F103的I2C库函数,例如HAL库中的HAL_I2C_Mem_Read()和HAL_I2C_Mem_Write()函数。 ### 回答2: STM32F103是一种非常流行的32位单片机系列,它具有强大的硬件性能和广泛的应用领域。而24C02则是I2C系列串行EEPROM,可以供我们存储大量的数据。在这里,我们主要介绍如何使用STM32F103的硬件I2C接口来读写24C02。 首先,我们需要对STM32F103的硬件I2C接口进行初始化。其中,我们需要配置I2C的时钟、GPIO口、I2C的工作模式等参数。具体的代码如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//使能I2C1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PB6--I2C1_SCL,PB7--I2C1_SDA GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//开漏输出 GPIO_Init(GPIOB,&GPIO_InitStructure); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//I2C模式 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//占空比为2 I2C_InitStructure.I2C_OwnAddress1 = 0x00;//自己的地址,一般为0 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//地址长度 I2C_InitStructure.I2C_ClockSpeed = 400000;//400kHZ时钟频率 I2C_Init(I2C1,&I2C_InitStructure); I2C_Cmd(I2C1,ENABLE);//使能I2C1 接着,我们编写读取21C02的程序。读取时,由于24C02是以字节为单位进行数据的读取,所以我们可以使用IIC的硬件读取指令,在读取时起始地址+1的下一个字节为第一个地址,直至读取结束地址。具体的代码如下: I2C_GenerateSTART(I2C1,ENABLE); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//等待START信号发送成功 I2C_Send7bitAddress(I2C1,0xA0,I2C_Direction_Transmitter);//发送器件地址,写命令0xA0 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待发送器件地址成功 I2C_SendData(I2C1,0x00);//发送内部地址0x00 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送成功 I2C_GenerateSTART(I2C1,ENABLE); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//等待START信号发送成功 I2C_Send7bitAddress(I2C1,0xA0,I2C_Direction_Receiver);//发送器件地址,读命令0xA1 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//等待接收器件地址成功 for(i=0;i<length;i++) { if(i==(length-1))I2C_AcknowledgeConfig(I2C1,DISABLE);//如果是最后一个字节,后面不再发送AK信号,即不再接收数据 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); RxBuffer[i]=I2C_ReceiveData(I2C1); } I2C_GenerateSTOP(I2C1,ENABLE);//发送一个停止信号 再来看一下24C02的写入操作。通过IIC硬件写入指令,我们可以将数据依次写入到指定的地址中,假如写入了n个字节,则下一次写操作的地址将会到达第n+1个地址。具体的代码如下: I2C_GenerateSTART(I2C1,ENABLE); while(! I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//等待START信号发送成功 I2C_Send7bitAddress(I2C1,0xA0,I2C_Direction_Transmitter);//发送器件地址,写命令0xA0 while(! I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待发送器件地址成功 I2C_SendData(I2C1,Addr);//发送写入的地址 while(! I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送成功 for(i=0;i<length;i++) { I2C_SendData(I2C1,buf[i]);//发送数据 while(! I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送成功 } I2C_GenerateSTOP(I2C1,ENABLE);//发送一个停止信号 综上所述,我们可以通过STM32F103的硬件I2C接口来读取或写入24C02。不过,在实际操作中,还需要注意一些注意事项,如使用IIC读取有ACK和无ACK状态,需要注意IIC的时序等问题。 ### 回答3: STM32F103是一款基于ARM Cortex-M3内核的微控制器,支持多种通信接口,包括I2C总线接口。24C02是一种I2C EEPROM芯片,可用于存储小型数据和程序。 在STM32F103中,可以通过GPIO配置I2C总线接口来进行24C02的读写操作。以下是实现I2C读写的基本步骤: 1. 配置GPIO引脚 使用CubeMX或者直接编写代码,将STM32F103的GPIO引脚配置成I2C总线引脚。通常I2C总线由两个引脚组成,即数据线(SDA)和时钟线(SCL),其中SDA引脚为双向输出,SCL引脚为输出。 2. 配置I2C总线 使用CubeMX或者直接编写代码,将STM32F103的I2C总线配置成所需的速率和从设备地址。24C02只有一个地址(0x50),因此将其配置为从设备地址即可。 3. 发送I2C起始信号 在进行I2C通信之前,需要先发送起始信号。发送起始信号的代码如下: HAL_I2C_Master_Transmit(&hi2c1, 0xA0, NULL, 0, 100); 其中hi2c1为I2C总线句柄,0xA0为24C02的从设备地址。 4. 发送I2C写入地址 在向24C02写入数据之前,需要先向其写入地址。该地址为数据的存储地址,可以根据具体要求进行设置。例如,向地址0x00写入数据,代码如下: HAL_I2C_Master_Transmit(&hi2c1, 0xA0, &addr, 1, 100); 其中addr为写入的地址。 5. 发送数据 在向24C02写入数据之前,需要先向其发送要写入的数据。代码如下: HAL_I2C_Master_Transmit(&hi2c1, 0xA0, &data, 1, 100); 其中data为要写入的数据。 6. 发送I2C停止信号 在完成I2C通信后,需要发送停止信号。发送停止信号的代码如下: HAL_I2C_Stop(&hi2c1); 以上是向24C02写入数据的基本步骤,读取数据的方法类似,只需将写入操作替换为读取操作即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值