linux下at24c02驱动程序,Linux下iic(i2c)读写AT24C02

linux内核上已有iic的驱动,因此只需要对该iic设备文件进行读写则能够控制外围的iic器件。这里以AT24C02为对象,编写一个简单的

linux内核上已有iic的驱动,因此只需要对该iic设备文件进行读写则能够控制外围的iic器件。这里以AT24C02为对象,编写一个简单的读写应用程序。iic设备文件在我的开发板上 /dev/i2c/0  ,打开文件为可读写。AT24C02的器件地址为0x50 ,既是iic总线上从器件的地址,,每次只读写一字节数据。

/************************************************************/

//文件名:app_at24c02.c

//功能:测试linux下iic读写at24c02程序

//使用说明: (1)

//          (2)

//          (3)

//          (4)

//作者:jammy-lee

//日期:2010-02-08

/************************************************************/

//包含头文件

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//宏定义

#define Address 0x50                  //at24c02地址

#define I2C_RETR

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 硬件IIC驱动 STM32F103C8T6内置硬件I2C接口(IIC),可以通过配置寄存器来实现IIC通讯。以下是一个简单的硬件IIC驱动程序示例,用于向一个从设备(例如AT24C02 EEPROM)写入和读取一个字节。 首先需要配置I2C的时钟和GPIO引脚,如下所示: ``` //配置I2C时钟和GPIO引脚 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); ``` 然后需要初始化I2C,设置通讯速率、地址等参数: ``` //初始化I2C I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); ``` 接下来就可以使用I2C驱动程序向AT24C02 EEPROM写入和读取数据了。以下是一个简单的示例: ``` //向AT24C02 EEPROM写入一个字节 void I2C_WriteByte(uint8_t deviceAddr, uint8_t regAddr, uint8_t data) { //发送开始信号 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //发送设备地址(写模式) I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //发送寄存器地址 I2C_SendData(I2C1, regAddr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送数据 I2C_SendData(I2C1, data); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送停止信号 I2C_GenerateSTOP(I2C1, ENABLE); } //从AT24C02 EEPROM读取一个字节 uint8_t I2C_ReadByte(uint8_t deviceAddr, uint8_t regAddr) { uint8_t data = 0; //发送开始信号 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //发送设备地址(写模式) I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //发送寄存器地址 I2C_SendData(I2C1, regAddr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送重复开始信号 I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //发送设备地址(读模式) I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //读取数据 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(I2C1); //发送停止信号 I2C_GenerateSTOP(I2C1, ENABLE); return data; } ``` 2. AT24C02读写 AT24C02是一种2Kbit(256字节)I2C EEPROM,可以通过I2C接口进行读写。以下是一个简单的示例,用于向AT24C02写入和读取一个字节。 首先需要定义AT24C02的设备地址和寄存器地址: ``` #define AT24C02_ADDR 0xA0 //设备地址 #define AT24C02_REG_ADDR 0x00 //寄存器地址 ``` 然后可以使用上面的I2C驱动程序来向AT24C02写入和读取数据了。以下是一个简单的示例: ``` //向AT24C02写入一个字节 void AT24C02_WriteByte(uint8_t data) { I2C_WriteByte(AT24C02_ADDR, AT24C02_REG_ADDR, data); } //从AT24C02读取一个字节 uint8_t AT24C02_ReadByte(void) { return I2C_ReadByte(AT24C02_ADDR, AT24C02_REG_ADDR); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值