花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点:
1.rIICCON &= ~0x10; 清中断必须要在rIICDS = slvAddr; 和rIICSTAT = 0xf0;  // 主设备,启动  之后

2.延时对于写外部的低速设备来说非常重要,比如while(flag)之后一定要加延时,还有在写数据时发现只能写入基数地址的数据,这也是由于延时导致的

3.开始调试的时候系统总是死在read的函数中,后来发现在数据手册的note中说当读取最后一个数据的时候一定不能返回ACK信号,而我却在程序中使用while(flag)来等待ACK引发中断,这不死才怪呢。。。。所以数据手册中的NOTE部分也是特别重要的

4.在真正对AT24C02A进行读取数据时,在发送带有读命令的从设备地址后,AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以一定要把该字节读取后抛弃,因为它不是我们所要读取的信息。

5.下面是核心代码:

#include "def.h"  
#include "2440addr.h"  
#include "I2C.h"  
#include "uart.h"   
extern void Delay(int time);   
int flag;   //用于标识是否收到应答信号,改标识在终端处理程序中被清0   
void Test_Iic(void)   
{   
    unsigned int i,j,save_E,save_PE;   
    static U8 data[256];   
    uart_printf("\nIIC Test(Interrupt) using AT24C02\n");   
    save_E   = rGPECON;   
    save_PE  = rGPEUP;   
    rGPEUP  |= 0xc000;                  //Pull-up disable   
    rGPECON |= 0xa00000;                //GPE15:IICSDA , GPE14:IICSCL    
    pISR_IIC = (unsigned)IicInt;   
    rINTMSK &= ~(BIT_IIC);   
      //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16   
      // If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz   
    rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);   
    rIICADD  = 0x10;                    //2440 slave address = [7:1]   
    rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)   
    rIICLC = (1<<2)|(1);                  // Filter enable, 15 clocks SDA output delay       added by junon   
       
    uart_printf("Write test data into AT24C02\n");   
    for(i=0;i<256;i++)   
       { Wr24C080(0xa0,(U8)i,i);   
        Delay(1);   //注意这个延时不能少,否则出现有些数据无法写入的问题   
       }       
    for(i=0;i<256;i++)   
        data[0] = 0;   
    uart_printf("Read test data from AT24C02\n");   
       
     for(i=0;i<256;i++)   
         Rd24C080(0xa0,(U8)i,&(data[i]));    
    for(i=0;i<16;i++)   
    {   
        for(j=0;j<16;j++)   
            uart_printf("%2x ",data[i*16+j]);   
        uart_printf("\n");   
    }   
    rINTMSK |= BIT_IIC;       
    rGPEUP  = save_PE;   
    rGPECON = save_E;   
}   
void Wr24C080(U32 slvAddr, U32 addr, U8 data)   
{   
    flag=1;  //应答标志   
    rIICDS = slvAddr;    
    rIICSTAT = 0xf0;  // 主设备,启动   
        rIICCON &= ~0x10;            //清中断标志 ,特别注意这条语句的位置,不能放到上条的前面     
    while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0   
     Delay(1);   
        
       
     flag =1 ; //readly to translate addr   
     rIICDS = addr;    
     rIICCON &= ~0x10;            //清中断标志   
     while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0   
     Delay(1);   
        
     flag =1 ; //readly to translate data   
     rIICDS = data;    
     rIICCON &= ~0x10;            //清中断标志   
     while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0   
     Delay(1);   
        
    rIICSTAT = 0xd0;                    //Stop MasTx condition    
    rIICCON  = 0xaf;                    //Resumes IIC operation.    
    Delay(1);   
       
}   
  
void Rd24C080(U32 slvAddr, U32 addr, U8 *data)   
{   
    unsigned char temp;   
    flag=1;  //应答标志   
    rIICDS = slvAddr;    
    rIICSTAT = 0xf0;  // 主设备发送模式用来发送slvAddr和addr,,启动   
    rIICCON &= ~0x10;            //清中断标志   
    while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0   
     Delay(1);   
        
    flag =1 ; //readly to translate addr   
     rIICDS = addr;    
     rIICCON &= ~0x10;            //清中断标志   
     while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0   
     Delay(1);   
           
    flag=1;   
    rIICDS = slvAddr;    
    rIICSTAT = 0xb0;  // 主设备接收模式用来接收数据,启动   
        rIICCON &= ~0x10;            //清中断标志   
    while(flag == 1)   //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0   
     Delay(1);   
       
    //注意:读取下面这个字节必须进行,因为在发送带有读命令的从设备地址后,   
    //AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以一定要把该字节读取后抛弃,因为它不是我们所要读取的信息;   
    flag =1 ; //readly to translate addr   
    temp = rIICDS;   // 抛弃第一自己   
    rIICCON &= ~0x10;            //清中断标志   
    while(flag)   
     Delay(1);   
        
    rIICCON = 0x2f;                  //Resumes IIC operation with NOACK.    
    *data = rIICDS;    
    Delay(1);   
     rIICSTAT = 0x90;                    //Stop MasTx condition    
     rIICCON  = 0xaf;                    //Resumes IIC operation.   
           
     Delay(1);   
       
}   
  
//-------------------------------------------------------------------------   
void __irq IicInt(void)   
{   
    
    rSRCPND = BIT_IIC;          //Clear pending bit   
    rINTPND = BIT_IIC;   
    flag = 0;   
      
}

原文链接:http://www.linuxidc.com/Linux/2011-06/37583p4.htm

S3C2440之IIC裸机驱动相关推荐

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

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 -- IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  2. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...

    转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...

  3. ccs 移植创建新工程_LiteOS裸机驱动移植05 | E53_SF1智慧消防扩展板驱动及使用

    (小熊派IoT开发套件全部教程   ↑点击启阅↑) ▷01 | 物联网一站式开发工具 IoT-Studio ▷02 | Hello World ▷03 | 任务管理 ▷04 | 信号量(任务同步) ▷ ...

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

    前面在Exynos4412 IIC总线驱动开发(一)-- IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构,下面进入我们的驱动开发过程 首先看一张代码层次图,有助于我们的理解 上面这些代码的展 ...

  5. 【华为云技术分享】小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用

    1. LCD裸机驱动 小熊派开发板使用的LCD屏幕为1.3寸的TFT彩屏,色彩深度16bit,分辨率240*240,使用 SPI 接口与 MCU 之间通信. 如果你对裸机玩转LCD屏幕还不熟悉,请先阅 ...

  6. 基于s3c2440的12864液晶驱动

    基于s3c2440的12864液晶驱动 12864是12864点阵液晶模块的点阵数简称,业界约定俗成的简称. 一.液晶显示模块概述 12864A-1 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 ...

  7. linux iic 设备驱动,linux IIC设备驱动.doc

    linux IIC设备驱动 //---------------IIC的linux驱动------------------#include #include #include #include #inc ...

  8. 以太网卡驱动程序移植linux,基于S3C2440的DM9000网卡驱动的移植

    摘  要: 主要研究了基于Linux内核的网卡驱动的移植.Linux网络设备驱动程序的体系结构可以分为4层,首先分析了各层的具体功能实现,并在此基础上充分利用S3C2440开发板完成DM9000网卡驱 ...

  9. X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代

    目录 点击这里查看所有博文   本系列博客,理论上适用于合宙的Air202.Air268.Air720x.Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持).   先不管支不支 ...

最新文章

  1. [C#泛型系列文章]
  2. 多项式加法 java 链表_多项式加法,用单链表实现。
  3. python 虚拟环境原理_Python 虚拟环境
  4. 8086地址传送指令LEA,LDS,LES
  5. c+gui语言可视化编程
  6. Citrix XenDesktop中VDA无法注册到DDC案例分享(一)
  7. vue项目html,Vue项目接口.html
  8. sqlserver2008R2下载安装教程
  9. Python_爬虫_urllib解析库
  10. 共享淘宝客app与独立淘宝客app哪个好?
  11. 4S店的大数据营销实战案例分析
  12. 新派重型混音教程|看了几年的混音教程,自己还是没有进步。(思想篇+技术篇+扫盲5个误区)|MZD Studios
  13. Animate.css动画库的使用操作
  14. 互联网日报 | 虎牙与斗鱼官宣合并;国内第四大运营商中国广电成立;拍拍贷完成存量业务清退...
  15. “我36岁了,还得对28岁的领导赔笑脸”:中年人的职场,心酸自知
  16. 为什么有时候我们在测试ESP32或ESP8266模块使用 QOUT/QIO 下载固件,程序无法正常运行? (DIO/DOUT 正常)另外ESP32功耗怎么校验?
  17. html clear 清楚li,CSS清楚浮动clear:both
  18. WIN7远程桌面连接方法!远程控制教程!XP远程桌面连接教程!如何设置远程桌面连接?远程桌面连接设置!
  19. windows8 下载
  20. 五步实现“中国制造”精益物流系统

热门文章

  1. 【跨境电商】5个最佳WordPress插件推荐
  2. 清华大学计算机学院考研参考书目,2020清华大学计算机考研参考书目及复试线...
  3. win10系统nfs服务器搭建
  4. 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1
  5. PDF合并在电脑上怎样实现?PDF合并的方法有哪些?
  6. DPU芯片头部企业云豹智能加入龙蜥社区,共同推动新一代数据中心基础设施蓬勃发展
  7. golang 时间missing Location in call to Date
  8. Python学习笔记4——csv/excel文件读写保存
  9. 计算机网络打不开怎么办,网页无法打开,详细教您有网络但是打不开网页怎么办?...
  10. Django 实现搜索结果分页(筛选结果分页),以及优雅添加多个筛选条件