S5PV210 Linux -- IO口模拟I2C总线驱动

本文档介绍了如何在S5PV210平台上使用Linux驱动程序来模拟I2C总线。内容涵盖驱动程序的编写,包括Makefile配置,以及一个简单的测试应用程序的创建。在调试过程中,重点关注ACK响应和读写时序的正确性,特别是在高主频环境下,需要考虑适当的延时以确保数据读取的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

驱动程序:

//////////////////////////////////////////////////////////////////////////
 //      FILE  : e2prom.c
 //      DATE  : 09/02/2011
 //      DESCRIPTION : rfid-card i2c driver source
 //      OS : Linux 2.6.35.7
 //      AUTHOR : light.wu
 //////////////////////////////////////////////////////////////////////////
 //    START:    在 SCL 线是高电平时,SDA线从高电平向低电平切换
 //    STOP:    当 SCL 是高电平时,SDA线由低电平向高电平切换
 //    所有主机在 SCL 线上产生它们自己的时钟来传输 IIC 总线上的报文 数据只在时钟的高电平周期有效,
 //    (可理解为传输出去)。数据 SDA 只有在 SCL 为低电平时才可以发生改变。
 //    ACK 数据传输必须带响应 相关的响应时钟脉冲由主机产生 在响应的时钟脉冲期间 发送器释放 SDA 
//    线为高 ,在响应的时钟脉冲期间 ,接收器必须将 SDA 线拉低 使它在这个时钟脉冲的高电平期间保持稳定的低电平。
 //    
 //////////////////////////////////////////////////////////////////////////
 #include<linux/init.h>
 #include<linux/module.h>
 
 #include <linux/kernel.h>
 #include <linux/fs.h>
 #include <linux/delay.h>
 #include <asm/irq.h>
 #include <mach/regs-gpio.h>
 #include <mach/hardware.h>
 #include <linux/device.h>
 #include <linux/gpio.h>
 
 #include <linux/slab.h>
 #include <linux/irq.h>
 #include <linux/poll.h>
 #include <linux/delay.h>
 
 #include <asm/io.h>
 
 #define GPIO_IIC_SCL        0        // S5PV210_GPG3(5),
 #define GPIO_IIC_SDA        1        // S5PV210_GPG3(6),
 #define I2C_AT24CXX_ADDRESS 0xb0
 #define I2C_AT24C02_MAXSIZE 0xff
 #define SCL_H  { gpio_set_value (S5PV210_GPG3(5), 1) ; }
 #define SCL_L  { gpio_set_value (S5PV210_GPG3(5), 0) ; }
 
 #define SDA_H  { gpio_set_value (S5PV210_GPG3(6), 1) ; }
 #define SDA_L  { gpio_set_value (S5PV210_GPG3(6), 0) ; }
 
 #define SDA_IN  { gpio_direction_input (S5PV210_GPG3(6)); }
 #define SDA_OUT { gpio_direction_output (S5PV210_GPG3(6),1); }
 #define SDA_OUT0 { gpio_direction_output (S5PV210_GPG3(6),0); }
 
 #define WHILE_SDA_HIGH (gpio_get_value (S5PV210_GPG3(6)))
 
 #define E2PROM_DEV_NAME "e2prom"
 static int major = 239 ;
 module_param( major, int, 0 ) ;
 unsigned int ByteDelayTimeout = 0x700 ;
 unsigned int BitDelayTimeout = 0x1000;
 static void ByteDelay ( void ) ;
 static void BitDelay ( void ) ;
 static int e2prom_open ( struct inode *, struct file * ) ;
 static int e2prom_release ( struct inode *, struct file * ) ;
 static int e2prom_read ( struct file *, char *, size_t, loff_t * ) ;
 static int 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值