I2C总线驱动代码

通过上篇对I2C总线的介绍,那面,接下来就需要软件部分针对I2C总线的编程实现。

具体细细道来,(前提是,已经找好两个IO口分别为SDA SCL)

1.1st function: I2c start

void IIC_Start(void)
{
    SDA_OUTPUT();
    SET_SDA();
    usleep(4);
    SET_SCL();
    usleep(6);
    CLR_SDA();
    usleep(4);
}

2. 2nd :I2c stop

void IIC_Stop (void)
{
    usleep(4);
    CLR_SCL();
    usleep(4);
    SDA_OUTPUT();
    usleep(4);
    CLR_SDA();
    usleep(4);
    SET_SCL();
    usleep(4);
    SET_SDA();
    usleep(4);
}

3. 3rd:ACK

void I2C_ACK(uint8_t ack)
{
    CLR_SCL();
    SDA_OUTPUT();
	usleep(2);
	if (ack)
	{
		SET_SDA();
	}
	else
	{
		CLR_SDA();
	}
	usleep(2);
    SET_SCL();
	usleep(4);
    CLR_SCL();
	usleep(4);
}

4. 4th :send one byte

void IIC_Byte_send (unsigned char data)
{
    int j;
    for ( j = 0; j < 8; j++ )
    {
		usleep(4);
		CLR_SCL();
		usleep(2);
        if ( data & 0x80 )  SET_SDA();
        else  CLR_SDA();
        data <<= 1;
        usleep(2);
        SET_SCL();
    }
	usleep(4);
}

5. 5th: receive one byte

void IIC_Byte_receive (unsigned char *data)
{
    int j;
    unsigned char tmp=0x00;

	CLR_SCL();
    for( j = 0 ; j < 0x08 ; j++)
    {
    	tmp <<=1;
        usleep(4);
        SET_SCL();
        usleep(2);
        if (TST_SDA())  tmp += 1;
        usleep(2);
        CLR_SCL();
    }
	usleep(4);
    *data = tmp;
}

6. 6th:send byte and wait ACK

int I2C_Send_data_Wait_ack(unsigned char data)
{
    IIC_Byte_send(data); //IIC send one byte
    CLR_SCL();              // high clock cycle
    SDA_INPUT();
    usleep(4);
    SET_SCL();
    usleep(4);
    if (0x00 == TST_SDA() )                 //ACK
    {
        usleep(4);
        CLR_SCL();
        usleep(4);
        SDA_OUTPUT();
        SET_SDA();
        usleep(4);
    }
    else
    {
        IIC_Stop();//NoACK
        SET_SCL();
        return(0);
    }
    return(1);
}

构建完这6个函数,I2C驱动还有什么理由通信不了呢?

当然了,大神们可能各有各的办法。小弟这里也只是抛砖引玉罢了。。。。。

时间: 2024-11-10 09:07:37

I2C总线驱动代码的相关文章

SylixOS iMX6平台I2C总线驱动

原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总线控制器__i2cHwInit函数,操作函数集(总线传输__i2cTransfer函数,总线控制__i2cMasterCtl函数). Imx6ul控制器的硬件描述 imx6ul处理器内部集成了一个I2C控制器,通过五个寄存器来进行控制. I2Cx_IADR I2C地址寄存器 I2Cx_IFDR I2

linux驱动之i2c总线驱动调用分析【基于linux4.4】

平台:RK3399 使用设备树描述板级资源: 框架: linux i2c框架同样采用分层.分离的模式设计:从上到下分为  app调用层.i2c core层.驱动层:驱动层又分为 cpu平台 i2c控制器相关的驱动层以及 i2c总线上挂接的设备驱动程序:而分离的思想则体现在板级相关的信息放在设备树上实现,而通用的读写.初始化流程.操作流程等则放到驱动里面实现(类似platform总线驱动): 具体分析: 1. cpu i2c控制器驱动(adpter) static struct platform_

platform总线驱动代码分析

/************************************************************************/ Linux内核版本:2.6.35.7 运行平台:三星s5pv210 /************************************************************************/ 1.本例中通过使用Linux驱动模型中的platform总线和led驱动框架编写出来的led驱动代码来分析platform总线的工作

驱动开发之I2C总线

驱动开发之I2C总线: I2C:数据线和时钟线. 起始信号:时钟线为高电平,数据线由高到低跳变. 结束信号:时钟线为高电平,数据线由低到高跳变. 应答信号:第九个时钟周期,时钟线保持为高电平,数据线为低电平,此时为成功应答. 读写位:站在主机的角度考虑. 0代表主机给从机发送数据. 1代表主机接收从机的数据. 硬件原理: 数据帧的封装:主机给从机发送数据: 起始信号 + 7位从机地址 写位 + 从机给主机应答 + 主机给从机发送8位数据 + 从机给主机应答 ... + 主机给从机发送8位数据 +

I2C总线、设备、驱动

I2C总线.设备.驱动 框架 I2C驱动框架可分为3个部分,分别是:I2C核心层.I2C总线驱动层(适配器层)以及I2C设备驱动层: I2C核心层 提供了统一的I2C操作函数,主要有两套函数smbus(system manager bus)和i2c_transfer: 其中smbus是i2c_transfer的一小部分,有一些适配器只支持smbus,当驱动中只是用部分I2C协议功能时可使用smbus,具体使用可参考内核源码目录下:kernel/Documentation/i2c/smbus-pr

Linux+I2C总线分析(主要是probe的方式)

Linux I2C 总线浅析 ㈠ Overview Linux的I2C体系结构分为3个组成部分: ·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法,I2C通信方法(即“algorithm”)上层的.与具体适配器无关的代码以及探测设备.检测设备地址的上层代码等.这部分是与平台无关的. ·I2C总线驱动: I2C总线驱动是对I2C硬件体系结构中适配器端的实现.I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter.I2C适配器的algorithm数据结构i2c_a

Exynos4412 IIC总线驱动开发(二)—— IIC 驱动开发

前面在Exynos4412 IIC总线驱动开发(一)-- IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构,下面进入我们的驱动开发过程 首先看一张代码层次图,有助于我们的理解 上面这些代码的展示是告诉我们:linux内核和芯片提供商为我们的的驱动程序提供了 i2c驱动的框架,以及框架底层与硬件相关的代码的实现.  剩下的就是针对挂载在i2c两线上的i2c设备了device,而编写的即具体设备驱动了,这里的设备就是硬件接口外挂载的设备,而非硬件接口本身(soc硬件接口本身的驱动可以理解为总

Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 -- IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.IIC总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信.例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇.可随时监

I2C 总线原理与架构

一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串行时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须由主机发起才可以,而 I2C 是基于multi master机制,一条总线上可允许多个master. 系统的I2C模块分为I2C总线控制器和I2C设备.I2C总线控制器是CPU提供的控制I2C总线接口,它控制I2C总线的协议.仲裁.时序.I2C设备是指通过I2C总线与CPU相连的设备,如EEPROM