|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
我自己用的I2C驱动,我只测过24C02,其它没测过 |
作者:eleven11 栏目:ARM技术 |
/$----------------------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 于 2005/6/2 13:33:00 发布:
错了不要扔我,我只是交流学习 /$----------------------------------------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 于 2005/6/2 13:39:00 发布:
另外不允许有*号 替换的时候不小心把程序中的*页替换成$了,需要的自己改一下 |
4楼: | >>参与讨论 |
作者: eleven11 于 2005/6/2 14:02:00 发布:
我学习ARM时间也不长 感觉学习一定要写笔记,我学ARM就写了3万字的笔记,另外应该学完一个部件写一个不在OS运行上的驱动,等调试出来了,再可以写成UCOS2的,改改别人的程序,小打小闹的学的不会透澈 |
5楼: | >>参与讨论 |
作者: fuck许民诚 于 2005/6/2 14:40:00 发布:
re:eleven11 顶! |
6楼: | >>参与讨论 |
作者: eleven11 于 2005/6/2 15:49:00 发布:
事实上除了ZLG提供的资料,还有很多东西可以思考的 多个FIQ/IRQ中断同时发生时,该如何人为设置FIQ/非向量IRQ的优先级,1个定时器还可以有多个毫无联系的定时设置,是定时,不是PWM,如何同时使用RTC的全部增量中断…… 这些其实都是可以思考一下的,也是很有趣的 |
7楼: | >>参与讨论 |
作者: pubstar 于 2005/6/2 23:49:00 发布:
长这大还没有写过笔记,呵呵,不过,就是改不过来 |
8楼: | >>参与讨论 |
作者: lh007 于 2005/6/4 9:22:00 发布:
楼主的学习方法很值得学习! |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |