linux i2c 读写应用程序,Linux下iic(i2c)读写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_RETRIES   0x0701

#define I2C_TIMEOUT   0x0702

#define I2C_SLAVE     0x0703       //IIC从器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答这个问题!以下是使用软件I2C方式驱动AT24C02的STM32F103代码: ``` #include "stm32f10x.h" #include "delay.h" #define SDA GPIO_Pin_6 #define SCL GPIO_Pin_7 #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(uint32_t)8<<28;} #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(uint32_t)3<<28;} #define IIC_SCL PBout(7) //SCL #define IIC_SDA PBout(6) //SDA #define READ_SDA PBin(6) //输入SDA void IIC_Init(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_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); IIC_SDA = 1; IIC_SCL = 1; } void IIC_Start(void) { SDA_OUT(); IIC_SDA = 1; IIC_SCL = 1; delay_us(4); IIC_SDA = 0; delay_us(4); IIC_SCL = 0; } void IIC_Stop(void) { SDA_OUT(); IIC_SCL = 0; IIC_SDA = 0; delay_us(4); IIC_SCL = 1; IIC_SDA = 1; delay_us(4); } u8 IIC_Wait_Ack(void) { u8 ucErrTime = 0; SDA_IN(); IIC_SDA = 1; delay_us(4); IIC_SCL = 1; delay_us(4); while (READ_SDA) { ucErrTime++; if (ucErrTime > 250) { IIC_Stop(); return 1; } delay_us(1); } IIC_SCL = 0; return 0; } void IIC_Ack(void) { IIC_SCL = 0; SDA_OUT(); IIC_SDA = 0; delay_us(2); IIC_SCL = 1; delay_us(2); IIC_SCL = 0; } void IIC_NAck(void) { IIC_SCL = 0; SDA_OUT(); IIC_SDA = 1; delay_us(2); IIC_SCL = 1; delay_us(2); IIC_SCL = 0; } void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL = 0; for (t = 0; t < 8; t++) { if ((txd & 0x80) >> 7) IIC_SDA = 1; else IIC_SDA = 0; txd <<= 1; delay_us(2); IIC_SCL = 1; delay_us(2); IIC_SCL = 0; delay_us(2); } } u8 IIC_Read_Byte(unsigned char ack) { unsigned char i, receive = 0; SDA_IN(); for (i = 0; i < 8; i++) { IIC_SCL = 0; delay_us(2); IIC_SCL = 1; receive <<= 1; if (READ_SDA) receive++; delay_us(1); } if (ack) IIC_Ack(); else IIC_NAck(); return receive; } void AT24C02_WriteOneByte(u16 addr, u8 data) { IIC_Start(); IIC_Send_Byte(0xA0); IIC_Wait_Ack(); IIC_Send_Byte(addr >> 8); IIC_Wait_Ack(); IIC_Send_Byte(addr & 0xFF); IIC_Wait_Ack(); IIC_Send_Byte(data); IIC_Wait_Ack(); IIC_Stop(); delay_ms(5); } u8 AT24C02_ReadOneByte(u16 addr) { u8 temp; IIC_Start(); IIC_Send_Byte(0xA0); IIC_Wait_Ack(); IIC_Send_Byte(addr >> 8); IIC_Wait_Ack(); IIC_Send_Byte(addr & 0xFF); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0xA1); IIC_Wait_Ack(); temp = IIC_Read_Byte(0); IIC_Stop(); return temp; } int main(void) { IIC_Init(); while (1) { AT24C02_WriteOneByte(0x00, 0x01); // 在地址0x00写入数据0x01 delay_ms(200); AT24C02_WriteOneByte(0x01, 0x02); // 在地址0x01写入数据0x02 delay_ms(200); AT24C02_WriteOneByte(0x02, 0x03); // 在地址0x02写入数据0x03 delay_ms(200); u8 val_0x00 = AT24C02_ReadOneByte(0x00); // 从地址0x00一个字节 u8 val_0x01 = AT24C02_ReadOneByte(0x01); // 从地址0x01一个字节 u8 val_0x02 = AT24C02_ReadOneByte(0x02); // 从地址0x02一个字节 printf("val_0x00=%d, val_0x01=%d, val_0x02=%d\n", val_0x00, val_0x01, val_0x02); // 打印取的结果 delay_ms(1000); } } ``` 希望能够帮助您!如果您有更多问题,请随时和我联系。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值