Chinaunix首页 | 论坛 | 博客
  • 博客访问: 817846
  • 博文数量: 124
  • 博客积分: 1927
  • 博客等级: 上尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-31 14:06
文章分类

全部博文(124)

文章存档

2018年(5)

2017年(2)

2016年(6)

2015年(4)

2014年(24)

2013年(7)

2012年(11)

2011年(13)

2010年(52)

我的朋友

分类: LINUX

2011-06-28 15:14:28

1.实现过程说明

利用两个GPIO来模拟IIC总线,一跟用来模拟时钟SCL输出,而另一根用来模拟数据线SDA,通过时钟线产生的时序来传输(读or写)数据。

IIC总线的写数据过程:

1.         传输开始信号启动从机

2.         传输8位的从机地址(slave ID

3.         从机应答信号(0:应答(ACK);1:无应答)

4.         写从机寄存器地址

5.         从机应答信号

6.         写一个字节数据

7.         从机应答信号

8.         传输停止信号(设备停止)

9.         延时1ms左右(是必要的,因为设备关闭需要一定的时间,否则下一次启动会发生错误)

 

IIC总线的读数据过程:

1.         传输开始信号启动从机

2.         传输8位的从机地址(slave ID

3.         写从机寄存器地址

4.         从机停止

5.         重新启动从机

6.         传输8位的从机地址与读信号(slave ID|0x01

7.         读数据(8位数据无应答,16位数据传输前8位后主机要应答一次)

8.         从机停止

9.         延时1ms左右(是必要的,因为设备关闭需要一定的时间,否则下一次启动会发生错误)

(从及地址最低位为本次数据传输的方向:0为写,1为读)

在每次数据传输的时候都需要发送启动信号和停止信号!

2.开始结束条件实现

开始条件和结束条件

开始条件代码:结束条件代码:

int IIC_Start(void)
{
    IIC_GPIO_SDA_CFG_OUTPUT;
    IIC_SDA_HIGH;
    IIC_SCL_HIGH;
    
//SCL must >4.7us

    IIC_Wait(5);
    IIC_SDA_LOW;
    IIC_Wait(
5
);
    IIC _SCL_LOW;    

    
return 0
;
}

int IIC_Stop(void)
{
    IIC_GPIO_SDA_CFG_OUTPUT;
    IIC_SDA_LOW;
    IIC_Wait(
5);
    IIC_SCL_HIGH;
    
//SCL must >4.7us
    IIC_Wait(5);
    IIC_SDA_HIGH;

    
return 0;
}

     

由于初始化的时候我们将模拟SCLGPIO初始化为输出,而对SDAGPIO不进行初始化,根据操作来设置SDA的方向。

    其中IIC的延时根据你的当前系统时钟等需要重新的调试。

3IIC读写显示

   写字节的代码如下,真正的实现可以在对本文档中的函数进行再封装!

int IIC_WriteByte(uint8 data)
{
    uint32 bit;
    
int Status;

    IIC_GPIO_SDA_CFG_OUTPUT;
    IIC_Wait(
1);

    
for(bit=0;bit<8;bit++)
    
{
        
//we start write the data, now we write high bit
        if((data<<bit)&0x80)
        
{
            IIC_SDA_HIGH;
        }

        
else
        
{
            IIC_SDA_LOW;
        }

        
// we must delay //then we may debug ok
        IIC_Wait (5);
        IIC_SCL_HIGH;
        IIC_Wait (
5);    
        IIC_SCL_LOW;    
    }

    
    
//the following receiver ack signed 
    IIC_GPIO_SDA_CFG_INPUT;
    IIC_Wait(
1);
    IIC_SCL_HIGH;
    IIC_Wait(
1);

    
if(IIC_SDA_VALUE&0x0100)
    
{
        Status 
= -1;
    }

    
else
    
{
        Status 
= 0;
    }

    IIC_Wait(
2);
     IIC_SCL_LOW;

    
return Status;    
}

         读字节的代码:附上8位数据传输序列图:

int IIC_ReadByte(uint8 *data)
{
    uint32 bit;
    
int Status = 0;
    
*data=0;

    IIC_SCL_LOW;
    IIC_GPIO_SDA_CFG_INPUT;
    IIc_Delay(
50);

    
for(bit=0; bit<8; bit++)
    
{
        IIC_Wait(
5);

        
//set clock is high
        IIC_SCL_HIGH;
        
//then clock is high get data for IIC
        IIC_Wait(1);    

        (
*data) = (*data)<<1;
        
if (IIC_SDA_VALUE&0x100)
        
{
            (
*data)=(*data) + 1;
        }


        IIC_Wait(
4);
        IIC_SCL_LOW;
    }

     
    
return Status;
}

8-Bit Write Sequence:

8-Bit Read Sequence:

   做了已经半年多了,因此有很多东西都记不清了,希望这次能够简单的总结一下!

阅读(1367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~