S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC)

发布者:快乐的天使最新更新时间:2016-12-06 来源: eefocus关键字:S3C2440  IIC实验  读写EEPROM  软件模拟IIC 手机看文章 扫描二维码
随时随地手机看文章

使用S3C2440的GPE14--SCL和GPE15--SDA来软件模拟IIC:

由于不清楚如何像51那样位定义,就特意进行了如下定义:   

#define IIC_SDA_L (rGPEDAT = rGPEDAT & ~(1<<15))
#define IIC_SDA_H  (rGPEDAT = rGPEDAT |  (1<<15))
#define    IIC_SCL_L  (rGPEDAT = rGPEDAT & ~(1<<14))
#define    IIC_SCL_H  (rGPEDAT = rGPEDAT |  (1<<14))


初始化:
void IIC_Init()

{
//GPE15--SDA   GPE14--SCL
        rGPEUP  = 0xc000;
        rGPECON = 0x50000000;
        IIC_SCL_L;
        IIC_SDA_H;
        Delay_moment(10);
        IIC_SCL_H;
}


S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC) - lastnight1034 - lastnight1034的博客


START CONDITION: 
        A high-to-low transition of SDA with SCL high is a start condition which must precede any othe rcommand (refer to Start and Stop Definition timing diagram).

void IIC_Start()


{
        IIC_SDA_H;
        IIC_SCL_H;
        Delay_moment(10);
        IIC_SDA_L;
        Delay_moment(15);
        IIC_SCL_L;
        Delay_moment(15);
}

STOP CONDITION:
         A low-to-high transition of SDA with SCL high is a stop condition. After a read sequence, the stop command will place the  EEPROM in a standby power mode (refer to Start and Stop Definition timing diagram).

void IIC_Stop()

{
        IIC_SCL_L;
        IIC_SDA_L;
        Delay_moment(10);
        IIC_SCL_H;
        Delay_moment(20);
        IIC_SDA_H;
        Delay_moment(10);
}
 是故写或读数据必须在SCL为低时,避免造成START和STOP的条件触发。



写8位数据:在SCL为低时把数据通过SDA输出,翻转SCL。

void Write_8bit(U32 data)

{
        unsigned int i;
        for(i=0;i<8;i++)
        {
                if(data & (1<<(7-i)))
                        IIC_SDA_H;
                else 
                        IIC_SDA_L;
                Delay_moment(10);
                IIC_SCL_H;
                Delay_moment(10);
                IIC_SCL_L;
        }
        Delay_moment(10);
}

读8位:在SCL为低时读取SDA上面的电平。

U8 Read_8bit()

{
        unsigned int i;
        U8 temp = 0;

        rGPECON = 0x10000000;       //SDA input
        Delay_moment(10);
        for(i=0;i<8;i++)
        {
                IIC_SDA_H;
                if(rGPEDAT & (1<<15))
                        temp |= (1<<(7-i)); 
                Delay_moment(10);
                IIC_SCL_H;
                Delay_moment(10);
                IIC_SCL_L;
                Delay_moment(10);
        }
        rGPECON = 0x50000000;    //SDA output
        IIC_SDA_H;
        Delay_moment(10);
        return temp;
}


S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC) - lastnight1034 - lastnight1034的博客

应答ACKNOWLEDGE: 
        All addresses and data words are serially transmitted to and from the EEPROM in 8-bit words. The EEPROM sends a zero to acknowledge that it has received each word. This happens during the ninth clock cycle.
在第9个时钟的高电平读取SDA。为0则正确应答。

U8 Acknowledge()

{
        unsigned char temp;

        rGPECON = 0x10000000;     //SDA input
        Delay_moment(30);
        IIC_SCL_H;
        Delay_moment(10);
        temp = rGPEDAT & (1<<15);   //read SDA
        Delay_moment(10);
        IIC_SCL_L;
        Delay_moment(10);
        rGPECON = 0x50000000;       //SDA output
        Delay_moment(30);

        if(temp)
                return 1;                       //ACK fault
        else 
                return 0;                      //ACK OK

}


S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC) - lastnight1034 - lastnight1034的博客

 写操作,可以连续写多个字节。

void IIC_Write_nByte(U32 slave_addr,U32 IIC_addr,U8 byte_Count,U8 *WriteData)

{
        unsigned int i;

        IIC_Start();

        Write_8bit(slave_addr |  0);
        if(Acknowledge())       //if return 1,exit
        {
                IIC_Stop();
                return;
        }  


        Write_8bit(IIC_addr);   //写数据的起始地址
        if(Acknowledge())
        {
                IIC_Stop();
                return;
        }

        for(i=0;i        {
                Write_8bit(WriteData[i]);
                if(Acknowledge())
                {
                        IIC_Stop();
                        return;
                }
        }

        IIC_Stop();
}


S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC) - lastnight1034 - lastnight1034的博客

读操作:读操作必须要先写设备地址和数据起始地址,然后再写设备地址(带读标志),读的最后一个字节NO ACK。

void IIC_Read_nByte(U32 slave_addr,U32 IIC_addr,U8 byte_Count,U8*ReadBuffer)

{
        unsigned int i;
        IIC_Start();


        Write_8bit(slave_addr | 0);  //第一次写设备地址,写操作
        if(Acknowledge())
        {
                IIC_Stop();
                return;
        }


        Write_8bit(IIC_addr);   //写数据起始地址
        if(Acknowledge())
        {
                IIC_Stop();
                return;
        }


        IIC_Start();     //Restart


        Write_8bit(slave_addr | 0x01);  //写设备地址,带读操作
        if(Acknowledge())
        {
                IIC_Stop();
                return;
        }


        for(i=0;i        {
                ReadBuffer[i] = Read_8bit();
                if(Acknowledge())
                {
                        IIC_Stop();
                        return;
                }
        }
        ReadBuffer[byte_Count-1] = Read_8bit(); //读的最后一个数据,不判断ACK,直接结束


        IIC_Stop();

}

 

写6位:IIC_Write_nByte(0xa0,0x11,6,&(WriteBuffer[0]));
读6位:IIC_Read_nByte(0xa0,0x11,6,&(databuffer[0]));


关键字:S3C2440  IIC实验  读写EEPROM  软件模拟IIC 引用地址:S3C2440 测试程序(七) IIC实验2--读写EEPROM(软件模拟IIC)

上一篇:S3C2440中断分析
下一篇:S3C2440 测试程序(七) IIC实验1--读写EEPROM(不开中断)

推荐阅读最新更新时间:2024-03-16 15:23

s3c2440外部中断
上文用到了pwm控制蜂鸣器,实现了蜂鸣器频率的改变,有一点不好就是蜂鸣器一直响,可以用一个交互的方式来关闭蜂鸣器。这里就选择按键,开发板上一共4个按键,对应这4个外部中断EINT0,EINT1,EINT2和EINT4(为什么不是EINT0~3呢,让人蛋疼) 要使用外部中断,首先要初始化外部中断。外部中断跟外部引脚F和G复用。要把相应的引脚配置为中断模式: 配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK 有些位对应着多个外部中断; 由于存在位对应着多个外部中断,如上图 EINT4~7 EINT8~23 对
[单片机]
<font color='red'>s3c2440</font>外部中断
S3C2440裸机------从零实现用于裸机调试的printf函数
我们的C语言中有标准的printf,可以很方便的打印一些变量的值用于调试,在嵌入式开发中,我们通过串口实现我们自己的printf函数,将一些变量值通过串口打印出来。 1.printf函数介绍 首先看一下C语言中的printf函数中的格式字符,我们就是要实现下表中的几个格式字符。 然后看一下printf函数的声明,int printf(const char * format, ...); format: 表示固定参数, ...: 表示可变参数 2.手动确定可变参数 要实现printf函数,首先我们要知道怎么取到format和...所接受到的参数,我们取参数的依据就是:x86平台,函数调用时参数传递是使用堆栈来实
[单片机]
<font color='red'>S3C2440</font>裸机------从零实现用于裸机调试的printf函数
s3c2440】第一课:程序烧写方法
此系列笔记以韦东山老师的开发板为主。 本节会获得的知识: 使用openJTAG烧写的方法 使用DNW和uboot烧写的方法 整个操作系统的烧写方法 1、安装USB驱动和openJTAG驱动 在win10上安装openJTAG需要禁用驱动程序强制签名,详情在参考手册中。这里有简单的步骤: (1)禁用驱动程序强制签名: 设置- 更新和安全- 选“恢复”- 立即重启- 疑难解答- 高级选项- 启动设置- 点击“重启”,重启后按数字7,禁用驱动程序强制签名,自动重启完成 (2)安装驱动: 设备管理器- 更新驱动程序软件- 手动查找驱动- 选择驱动所在的位置- 下一步完成 USB驱动也不
[单片机]
【<font color='red'>s3c2440</font>】第一课:程序烧写方法
S3C2440c语言汇编传参点灯
编写代码 led.c void delay(volatile int d) { while (d--); } int led_on(int which) { unsigned int *pGPFCON = (unsigned int *)0x56000050; unsigned int *pGPFDAT = (unsigned int *)0x56000054; if (which == 4) { /* 配置GPF4为输出引脚 */ *pGPFCON = 0x100; } else if (which == 5) { /* 配置GPF5为输出引脚 */ *p
[单片机]
S3C2440c语言汇编传参点灯
linux 2.6.32 在arm9(s3c2440)平台的移植 - LCD背光驱动
LCD背光是通过 CPU的 LCD_PWR引脚来控制的, 当LCD_PWR输出1, 亮 , 输出0则灭. 以下的代码均参考mini2440的移植手册 (1)新建/drivers/video/mini2440_backlight.c #include linux/errno.h #include linux/kernel.h #include linux/module.h #include linux/slab.h #include linux/input.h #include linux/init.h #include linux/serio.h #include linux/delay.h #include
[单片机]
S3C2440 测试程序(一)PWM控制蜂鸣器测试
while(1) { U8 idx; Uart_Printf( \nPlease select function : \n ); for(i=0; CmdTip .fun!=0; i++) Uart_Printf( %d : %s\n , i, CmdTip .tip); idx = Uart_GetIntNum_GJ() ; if(idx i) { (*CmdTip .fun)(); Delay(20); Uart_Init( 0,115200 ); } } struct {
[单片机]
MMU工作原理以及S3C2440的MMU
MMU,全称Memory Manage Unit, 中文名——存储器管理单元。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以 内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面 前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将 调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯
[单片机]
MMU工作原理以及<font color='red'>S3C2440</font>的MMU
基于S3C2440微处理器的工业超声探伤仪设计与实现
超声波探伤仪的种类繁多,但在实际的探伤过程,脉冲反射式超声波探伤仪应用的最为广泛。一般在均匀的材料中,缺陷的存在将造成材料的不连续,这种不连续往往又造成声阻抗的不一致,由反射定理我们知道,超声波在两种不同声阻抗的介质的交界面上将会发生反射,反射回来的能量的大小与交界面两边介质声阻抗的差异和交界面的取向、大小有关。脉冲反射式超声波探伤仪就是根据这个原理设计的。   超声探伤时,应用得最多的是A型显示,如图1所示。在A型显示中,横坐标代表被测物的深度,纵坐标代表回波信号的幅度。   本文利用ARM9芯片和高速FPGA数据采集及信号处理技术,在Linux操作系统平台上设计并实现了一种新型数字超声探伤仪。该探伤仪具有高性能、低成
[单片机]
基于<font color='red'>S3C2440</font>微处理器的工业超声探伤仪设计与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved