登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

我自己用的I2C驱动,我只测过24C02,其它没测过

作者:eleven11 栏目:ARM技术
我自己用的I2C驱动,我只测过24C02,其它没测过
/$----------------------COPYRIGHT (c)--------------------------------
$$
$$                      ARM驱动库--
$$                     LPC2104通用驱动配置文件
$$
$$------------------------文件信息----------------------------------
$$文   件   名: DriverConfig.h
$$创   建   人: ARMstudent@sina.com
$$最后修改日期: 2005.5.25
$$描        述: 所有外设驱动的配置文件
$$----------------------------历史版本信息---------------------------
$$ 创建人: ARMstudent@sina.com
$$ 版  本: V1.0
$$ 日 期: 2005.4.17
$$ 描 述: 完成I2C驱动配置
$$-------------------------------------------------------------------
$$ 修改人: ARMstudent@sina.com
$$ 版  本: V1.1
$$ 日 期: 2005.4.28
$$ 描 述: 完成SPI驱动配置
$$-------------------------------------------------------------------
$$ 修改人: ARMstudent@sina.com
$$ 版  本: V1.2
$$ 日 期: 2005.5.3
$$ 描 述: 完成UART0驱动配置
$$-------------------------------------------------------------------
$$ 修改人: ARMstudent@sina.com
$$ 版  本: V1.3
$$ 日 期: 2005.5.15
$$ 描 述: 完成IAP驱动配置
$$-------------------------------------------------------------------
$$ 修改人: ARMstudent@sina.com
$$ 版  本: V1.4
$$ 日 期: 2005.5.21
$$ 描 述: 完成RTC驱动配置
$$-------------------------------------------------------------$/
#include "myfun.h"
#include "Queue.h"
#include "QueueTAB.h"

#define I2CDriver_En    0     //为1则使用I2C驱动
#define SPIDriver_En    0     //为1则使用SPI驱动
#define UART0Driver_En  0     //为1则使用UART0驱动
#define IAPDriver_En    0     //为1则使用IAP驱动
#define RTCDriver_En    0     //为1则使用RTC驱动

/$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$/
#if I2CDriver_En==1
/$-----------------------I2C驱动使用说明---------------------------
$$ 描 述:I2C器件存储空间按页存放,0~255字节为第0页,256~511字节为 $$        第1页,依次类推,(AT24C01只有0页,大小为128字节)
$$        调用I2CRead和I2CWrite指定页和子地址可向I2C器件进行读写操作
$$
$$ 函数参数限制如下:
$$
$$ I2C_SLA0/1        AT24C01        SLA<=7         
$$                   AT24C02        SLA<=7
$$                   AT24C04        SLA<=3
$$                   AT24C08        SLA<=1   
$$                   AT24C16        SLA=0
$$                   AT24C32        SLA<=7    
$$                   AT24C64        SLA<=7
$$                   AT24C128       SLA=0
$$                   AT24C256       SLA<=3
$$                                     
$$ I2C_PAGEADD0/1    AT24C01        I2C_PAGEADD=0
$$                   AT24C02        I2C_PAGEADD=0
$$                   AT24C04        I2C_PAGEADD<=1  
$$                   AT24C08        I2C_PAGEADD<=3   
$$                   AT24C16        I2C_PAGEADD<=7
$$                   AT24C32        I2C_PAGEADD<=15    
$$                   AT24C64        I2C_PAGEADD<=31
$$                   AT24C128       I2C_PAGEADD<=63
$$                   AT24C256       I2C_PAGEADD<=127
$$                                    
$$ I2C_NUM0/1 I2C_SLAADD0/1    AT24C01    I2C_SLAADD+I2C_NUM<=128
$$                             AT24C02    I2C_SLAADD+I2C_NUM<=256
$$                             AT24C04    I2C_SLAADD+I2C_NUM<=256
$$                             AT24C08    I2C_SLAADD+I2C_NUM<=256
$$                             AT24C16    I2C_SLAADD+I2C_NUM<=256
$$                             AT24C32    I2C_SLAADD+I2C_NUM<=256
$$    &nb
2楼: >>参与讨论
eleven11
错了不要扔我,我只是交流学习
/$----------------------------------------COPYRIGHT (c)--------------
$$
$$                                        ARM驱动库--
$$                                     LPC2104通用驱动文件
$$
$$------------------------------------------文件信息-----------------
$$文   件   名: I2CDriver.h
$$创   建   人: ARMstudent@sina.com
$$最后修改日期: 2005.4.21
$$描        述: LPC2104/2105/2106-AT24C01/02/04/08/16/32/64/128/256 的I2C接口通用驱动文件
$$              可对总线上多个同一型号的AT24C$$进行数据传输
$$----------------------------------------历史版本信息---------------
$$ 创建人: ARMstudent@sina.com
$$ 版  本: V1.0
$$ 日 期: 2005.4.17
$$ 描 述: 24C02测试完成,其它条件不允许T_T
$$-----------------------------------------------------------------$/
volatile uint8  I2C_ADD_STA;     //在16位的地址中指示哪些位已发送,为1为已经处理或初始态,为2表示高8位已发送
volatile uint8  I2C_SLA;         //器件物理地址SLA
volatile uint16 I2C_NUM;         //一次要读写I2C数据数
volatile uint8  *I2C_BUFF;       //指定要写入I2C的数组的首地址或指定从I2C读取后存放数组的首地址
volatile uint8  I2C_WRTYPE;      //读写操作的状态: 为0表示此次调用是向I2C写入数据;为1表示此次调用是从I2C器件中读出数据
volatile uint8  I2C_SLAADD;      //I2C器件的子地址
volatile uint8  I2C_PAGADD;      //I2C器件的页地址
volatile uint8  I2C_ENDSTA;      //传输完毕时的状态:为0x11则正确传输完毕;为0x22则总线出错;
volatile uint8  I2C_DATABUF;     //用于单个字节写入时候的缓冲区

/$-------------------------------------------------------------------
$$ 函数名称: __irq IRQ_I2C
$$ 功能描述: I2C中断服务程序,系统函数
$$ 输 入:   无
$$ 输 出:   无      
$$ 全局变量: I2C_ENDSTA,I2C_WRTYPE,I2C_ADD_STA,I2C_SLA,I2C_NUM,$I2C_BUFF,I2C_SLAADD,I2C_PAGADD
$$ 调用模块: 无
$$ 作 者:   ARMstudent@sina.com
$$ 日 期:   2005.4.17
$$-----------------------------------------------------------------$/
void __irq IRQ_I2C(void)
{
uint8 TEMP;
TEMP=I2STAT;
if(I2C_WRTYPE==0)                    //判断此次操作是读还是写
{
  SWITCH(TEMP)                        //以下是写操作
  {
   case 0x08:                         //启动总线
    #if defined AT24C04
    I2DAT=((I2C_SLA<<2)|0xA0)|(I2C_PAGADD<<1);
    #elif defined AT24C08
    I2DAT=((I2C_SLA<<3)|0xA0)|(I2C_PAGADD<<1);   
    #elif defined AT24C16
    I2DAT=(I2C_PAGADD<<1)|0xA0;
    #else
    I2DAT=(I2C_SLA<<1)|0xA0;
    #endif
    I2CONCLR=0x28;
    break;
   case 0x18:                        //发送写控制字
    #if((defined AT24C32)||(defined AT24C64)||(defined AT24C128)||(defined AT24C256))
    I2DAT=I2C_PAGADD;
    I2C_ADD_STA=2;
    #else
    I2DAT=I2C_SLAADD;
    #endif
    I2CONCLR=0x08;
    break;
   case 0x28:                       //发送数据并接收到从器件应答
    #if((defined AT24C32)||(defined AT24C64)||(defined AT24C128)||(defined AT24C256))
    if(I2C_ADD_STA==2)
    {
     I2DAT=I2C_SLAADD;
     I2C_ADD_STA=1;
    }
    #endif
    if(I2C_ADD_STA==1)
    {
     if(I2C_NUM>0)
     {
      I2DAT=*I2C_BUFF++;
      I2C_NUM--;      
     }
     else
     {
      I2CONSET=0x10;
      I2C_ENDSTA=0x11;
     }
    }
    I2CONCLR=0x08;               
    break;
   case 0x20:               //错误
   case 0x30:
   case 0x38:
    I2CONSET=0x10;
    I2CONCLR=0x08;
    I2C_ENDSTA=0x22;
  }
}
else
{
  SWITCH(TEMP)                 //以下执行读操作
  {
   case 0x08:                  //启动总线
    #if defined AT24C04
    I2DAT=((I2C_SLA<<2)|0xA0)|(I2C_PAGADD<<1);
    #elif defined AT24C08
    I2DAT=((I2C_SLA<<3)|0xA0)|(I2C_PAGADD<<1);   
    #elif defined AT24C16
    I2DAT=(I2C_PAGADD<<1)|0xA0;
    #else
    I2DAT=(I2C_SLA<<1)|0xA0;
    #endif
    I2CONCLR=0x28;
    break;
   case 0x18:                //发送写控制字
    #if((defined AT24C32)||(defined AT24C64)||(defined AT24C128)||(defined AT24C256))
    I2DAT=I2C_PAGADD;
    I2C_ADD_STA=2;
    #else
    I2DAT=I2C_SLAADD;
    #endif
    I2CONCLR=0x08;
    break;
   case 0x28:            
3楼: >>参与讨论
eleven11
另外不允许有*号
替换的时候不小心把程序中的*页替换成$了,需要的自己改一下

4楼: >>参与讨论
eleven11
我学习ARM时间也不长
感觉学习一定要写笔记,我学ARM就写了3万字的笔记,另外应该学完一个部件写一个不在OS运行上的驱动,等调试出来了,再可以写成UCOS2的,改改别人的程序,小打小闹的学的不会透澈

5楼: >>参与讨论
fuck许民诚
re:eleven11
顶!

6楼: >>参与讨论
eleven11
事实上除了ZLG提供的资料,还有很多东西可以思考的
    多个FIQ/IRQ中断同时发生时,该如何人为设置FIQ/非向量IRQ的优先级,1个定时器还可以有多个毫无联系的定时设置,是定时,不是PWM,如何同时使用RTC的全部增量中断……

这些其实都是可以思考一下的,也是很有趣的



7楼: >>参与讨论
pubstar
长这大还没有写过笔记,呵呵,不过,就是改不过来
 
8楼: >>参与讨论
lh007
楼主的学习方法很值得学习!
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
请问这是什么 warning ?如何消除?
在ucos中每个任务一定要调用OSTimeDly吗?
在ADS下怎样替换库函数?
如何编写加载描述符?
求助:LPC2129CAN接收过滤怎么设置
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号