- 浏览: 30213 次
最新评论
I2C―― C程序
2012年01月09日
一、 慨述:
1) 这是EasyARM2100 examples 中的I2C―― C程序。
I2CTEST.C 是I2C主模式工程应用文件;
I2CINI.C 是基于具有硬件I2C的软件包(主模式);
CSI24WC02.C 是I2C从模式工程应用文件。
2) I2C的实现是基于中断方式,是有实用价值的,尤其是I2CINI.C 很精彩。
3) I2CTEST.C 没能与I2CINI.C 的精彩相呼应,如,I2CINI.C 中对ISendStr(),
IRcvStr()正常返回与失败退出,都有确定值,而I2CTEST.C 中都未考虑,而I2C通信的实际情况是不能不考虑――丢失仲裁、无应答等,否则,I2C通信不会成功。
4)其实只需在I2CTEST.C 中的 main()稍稍一改(套红处为改动处),就能与I2C通信的实际情况相吻合,具体的改动详见其后三。
二、EasyARM2100 examples 中的I2C ―― C程序原文:
/************************************************* ***************************
* 文件名:I2CINT.C
* 功能:硬件I2C软件包,利用中断方式操作。
* 说明:主程序要配置好I2C总线接口(GPIO、总线时钟)
************************************************** **************************/
#include "config.h"
/* 以下为I2C操作时所需要的变量,在调用I2C子程序前要设置好这些变量 */
volatile uint8 I2C_sla; // 从机地址
volatile uint8 I2C_suba; // 子地址
volatile uint8 *I2C_buf; // 数据缓冲区指针 (读操作时会被更改)
volatile uint8 I2C_num; // 操作数据个数 (会被更改)
volatile uint8 I2C_end; // 操作结束标志,为1时表示操作结束,为0xFF时表示操作失败 (会被设置)
volatile uint8 I2C_suba_en; // 子地址使能控制,读操作时请设置为1,写操作时请设置为2 (会被更改)
/************************************************* ***************************
* 名称:IRQ_I2C()
* 功能:I2C中断,通过判断I2C状态字进行相应的操作。
* 入口参数:无
* 出口参数:无
************************************************** **************************/
void __irq IRQ_I2C(void)
{ uint8 sta;
sta = I2STAT; // 读出I2C状态字
switch(sta)
{ case 0x08: // 己发送起始条件
if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE; // 指定子地址读时,先写入地址
else I2DAT = I2C_sla; // 否则直接发送从机地址
I2CONCLR = 0x28; // SI=0
break;
case 0x10:
I2DAT = I2C_sla; // 重启动总线后,发送从地址
I2CONCLR = 0x28; // SI=0
break;
case 0x18: // 已发送SLA+W,并已接收应答
if(0==I2C_suba_en) // 无子地址,则直接发送数据
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10; // 无数据发送,结束总线
I2CONCLR = 0x28;
I2C_end = 1; // 设置总线操作结束标志
}
break; } if(1==I2C_suba_en) // 发送子地址
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
}
if(2==I2C_suba_en)
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
I2C_suba_en = 0; // 子地址己处理
}
break;
case 0x28: // 已发送I2C数据,并接收到应答
if(0==I2C_suba_en) // 无子地址,则直接发送数据
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10; // 无数据发送,结束总线
I2CONCLR = 0x28;
I2C_end = 1;
}
break;
}
if(1==I2C_suba_en) // 若是指定地址读,则重新启动总线
{ I2CONSET = 0x20;
I2CONCLR = 0x08;
I2C_suba_en = 0; // 子地址己处理
}
break;
case 0x20:
case 0x30:
case 0x38:
I2CONCLR = 0x28; // 总线进入不可寻址从模式
I2C_end = 0xFF; // 总线出错,设置标志
break;
case 0x40: // 己发送SLA+R,并已接收到应答
if(1==I2C_num) // 最后一字节,接收数据后发送非应答信号
{ I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
}
else // 接收数据并发送应答信号
{ I2CONSET = 0x04; // AA=1,接收到数据后产生应答
I2CONCLR = 0x28;
}
break;
case 0x50:
*I2C_buf++ = I2DAT; // 读取数据
I2C_num--;
if(1==I2C_num)
{ I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
}
else
{ I2CONSET = 0x04; // AA=1,接收到数据后产生应答
I2CONCLR = 0x28;
} break; case 0x58: *I2C_buf++ = I2DAT; // 读取最后一字节数据
I2CONSET = 0x10; // 结束总线
I2CONCLR = 0x28;
I2C_end = 1;
break;
case 0x48:
I2CONCLR = 0x28; // 总线进入不可寻址从模式
I2C_end = 0xFF;
break;
default:
break;
}
VICVectAddr = 0x00; // 中断处理结束
}
/************************************************* ***************************
* 名称:ISendStr()
* 功能:使用硬件I2C发送数据。
* 入口参数:无
* 出口参数:返回值为0时表示出错,为1时表示操作正确。
* 说明:使用前设置好参数
************************************************** **************************/
uint8 ISendStr(uint8 sla, uint8 suba, uint8 *s, uint8 no)
{ /* 参数设置 */
I2C_sla = sla;
I2C_suba = suba;
I2C_buf = s;
I2C_num = no;
I2C_suba_en = 2;
I2C_end = 0;
I2CONCLR = 0x2C;
I2CONSET = 0x60; // 设置为主机,并启动总线
while(0==I2C_end);
if(1==I2C_end) return(1);
else return(0);
}
/************************************************* ***************************
* 名称:IRcvStr()
* 功能:使用硬件I2C读取数据。
* 入口参数:无
* 出口参数:返回值为0时表示出错,为1时表示操作正确。
* 说明:使用前设置好参数
************************************************** **************************/
uint8 IRcvStr(uint8 sla,uint8 suba,uint8 *s,uint8 no)
{ if(0==no) return(0);
/* 参数设置 */
I2C_sla = sla+1;
I2C_suba = suba;
I2C_buf = s;
I2C_num = no; I2C_suba_en = 1; I2C_end = 0; I2CONCLR = 0x2C; I2CONSET = 0x60; // 设置为主机,并启动总线
while(0==I2C_end);
if(1==I2C_end) return(1);
else return(0);
}
/************************************************* ***************************
* 文件名:I2CTEST.C
* 功能:使用硬件I2C对E2PROM进行操作,利用中断方式操作。
* 说明:将跳线器JP4_LED1、JP9短接。
************************************************** **************************/
#include "config.h"
#define CSI24WC02 0xA0 /* 定义器件地址 */
#define LED1CON (10; dly--)
for(i=0; i
发表评论
-
C/E盘各目录及Private文件夹详解
2012-01-20 10:59 738C/E盘各目录及Private文件夹详解 2011年09月2 ... -
中航工业洪都交付C919大飞机机身等直段部段
2012-01-20 10:59 858中航工业洪都交付C919大 ... -
C# 绑定值设定格式
2012-01-20 10:59 822C# 绑定值设定格式 2012年01月17日 1。日期格 ... -
boost log 使用碰到的问题.
2012-01-19 15:54 2147boost log 使用碰到的问题. 2011年12月30日 ... -
Solaris 10 U5的一个Xerror,是否是显卡未识别?
2012-01-19 15:54 1065Solaris 10 U5的一个Xerror,是否是显卡未识别 ... -
mysql pid file not found and can't connect to mysql through socket mysql.sock
2012-01-19 15:54 669mysql pid file not found and ca ... -
用断言风格写验证平台的基本方法
2012-01-19 15:54 1144用断言风格写验证平台的基本方法 22小时前 终于在Sy ... -
sco unix ftp 源代码
2012-01-19 15:54 859sco unix ftp 源代码 2012年01月08日 ... -
山寨宝马成卖点 中华V5市场展望
2012-01-17 05:47 559山寨宝马成卖点 中华V5 ... -
长安逸动 售价或与宝骏630持平
2012-01-17 05:47 717长安逸动 售价或与宝骏 ... -
商业地产招商的十大误区(转)
2012-01-17 05:47 593商业地产招商的十大误区(转) 2011年11月25日 很 ... -
现场奖品领取:11月24日,北语,法国美酒与日本寿司的对话
2012-01-17 05:40 714现场奖品领取:11月24日,北语,法国美酒与日本寿司的对话 ... -
礼制”思想的阐述
2012-01-16 04:33 765礼制”思想的阐述 2010 ... -
我为什么要找河南女人做老婆
2012-01-16 04:33 16262我为什么要找河南女人做老婆 2010年12月29日 ... -
[逸闻趣谈]中国42个城市在一个班级里的职务-----看到台北,我自己都忍不住笑了
2012-01-16 04:33 619[逸闻趣谈]中国42个城市在一个班级里的职务-----看到台北 ... -
南怀瑾-解读佛教的孝道(下)
2012-01-16 04:33 514南怀瑾-解读佛教的孝道(下) 2012年01月05日 ...
相关推荐
题目要求:对于一个实数列表,设计一个算法重整列表,使所有负数都位于所有非负数之前(不需要完全排序)。比较次数和数据移动次数要尽可能少,不能使用辅助数组。 输入:input.txt,第一行是元素数目N...――――――
《计算机基础与程序设计》作业题(一) (课程代码:02275) 一、单项选择题 1.I/O设备指的是计算机的( B ) A.存储设备 B.输入和输出设备 C.控制器 D.运算器 2.具有只读功能的内存储器是指( A ) A....
《计算机基础与程序设计》作业题(一) (课程代码:02275) 一、单项选择题 1.I/O设备指得就是计算机得( B ) A.存储设备 B.输入与输出设备 C.控制器 D。运算器 2。具有只读功能得内存储器就是指( A ) A.ROM...
ZKQ090103 Linux 开发环境与应用程序设计 Linux C 编程基础,gdb调式器,Makefile文件概述;Linux系统调用原理;基于系统调用的文件I/O操作;文件上锁,程序机制与功能,特殊文件的操作;串口编程,串口通信的实现;...
4 系统软件程序的简单设计 14 程序框图 14 程序 15 1 设计目的 设计目的 1、通过单片机课程设计,熟练掌握单片机C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。 2、通过定时/计数器控制两个...
bootcfg /disableredirect 在启动引导程序中禁用重定向。 bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings] 在启动引导程序中通过指定配置启用重定向。 范例: bootcfg /redirect com1 115200 ...
一个总线工具连接一台个人计算机(PC),然后到传感器的I2C、 SPI或其他可让传感器可以“说话”的协议。与总线工具相关的PC应用程序,提供了一个已知与工作来源用以发送和接收数据,且不是未知、未经 的嵌入
一个总线工具连接一台个人计算机(PC),然后到传感器的I2C、 SPI或其他可让传感器可以“说话”的协议。与总线工具相关的PC应用程序,提供了一个已知与工作来源用以发送和接收数据,且不是未知、未经认证的
目前,大多数一般用途的操作系统都提供了对 USB 设备的支持,并且用 C 或者 C++ 可以相对容易地开发访问这些外设的应用程序。不过,Java 编程语言在设计上对硬件访问提供的支持很少,所以编写与 USB 设备交互的应用...
5.16 实验十六 基于I2C接口的实时时钟实验..........................................................64 5.17 实验十七 EEPROM存储器读写实验...................................................................
――从Mobiles(IOI 2001)一题看多重二分》 杨旻旻 -《构造法——解题的最短路径》 张家琳 -《多项式乘法》 张 宁 -《遗传算法的特点及其应用》 张一飞 -《由感性认识到理性认识——透析一类搏弈游戏的解答过程》...
1 第一章 绪论....................................................................................................................................1 1.1 概述................................................