mini2440硬件篇之IIC
1. 硬件原理
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。
1.1. 数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
1.2. 起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。
1.3. 数据传送
a、主机向从机发送数据,数据传送方向在整个传送过程中不变:
b、主机在第一个字节后,立即从从机读数据
c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。
2. 芯片手册
2.1. ATMEL公司的AT24C系列
AT24C01:128字节(128×8位);
AT24C02:256字节(256×8位);
AT24C04:512字节(512×8位)AT24C08:1K字节(1K×8位);
AT24C16:2K字节(2K×8位);
AT24C系列E2PROM芯片地址的固定部分为1010,A2、A1、A0引脚接高、低电平后得到确定的3位编码。形成的7位编码即为该器件的地址码。
2.2. 写入
单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。
传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。
AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖
当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式 :
2.3. 读出
单片机先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。
然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。
3. mini2440电路图
由原理图可以看出,2440只有两根引脚和EEPROM连接。
4. S3C2440寄存器
IICCON 控制寄存器,控制是否发生ACK信号,设置发送器时钟,开启IIC中断。
IICSTAT 控制/状态寄存器,选择工作模式(从机接收、从机发生、主机接收、主机发送),发出S信号、P信号,使能接收/发送功能,并标识各种状态。
IICADDR 从机地址
IICDS 发送/接收寄存器,数据移位。
IICLC 行控制寄存器
iic.h
/******************************************************************** Copyright (C),2011-2012, XXX.* FileName: iic.h * Author:HuangYinqing* Version:1.0* Date::2012-04-22* Description:IIC读写EEPROM.* Function List:* History:******************************************************************/#ifndef __IIC_H__
#define __IIC_H__#define DBG_IIC_LEVEL 1
#define DEV_ADDR 0xa0/*函数声明*/
void IICInit(void);
void IICTest(void);#endif //__IIC_H__
iic.c
/******************************************************************** Copyright (C),2011-2012, XXX.* FileName: iic.c * Author:HuangYinqing* Version:1.0* Date::2012-04-22* Description:IIC驱动(中断方式).* Function List:* History:******************************************************************/#include "common.h"
#include "core.h"
#include "iic.h"unsigned char pucIICBuffer[32][8]; //IIC数据通讯缓存数组
unsigned char g_bIICFlag = 0; //应答标志/********************************************************************
函数功能:IIC中断函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
static void __irq IICIntHandler(void)
{rSRCPND = BIT_IIC; //Clear pending bitrINTPND = BIT_IIC;g_bIICFlag = 1;
}/********************************************************************
函数功能:IIC初始化。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void IICInit(void)
{rGPECON &= 0x0fffffff;rGPECON |= 0xa0000000; //GPE15:IICSDA , GPE14:IICSCL rGPEUP |= 3<<14; //Pull-up disable//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.198MHzrIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);rIICSTAT = 0x10; //IIC bus data output enable(Rx/Tx)#if 0rIICADD = 0x10; //2440 slave address = [7:1]rIICLC = (1<<2) | (1); // Filter enable, 15 clocks SDA output delay added by junon
#endifpISR_IIC = ( unsigned int )IICIntHandler;rINTMSK &= ~(BIT_IIC);
}/********************************************************************
函数功能:AT24c02a写函数。
入口参数:ulMemAddr:设备内存地址pucBuffer:IIC数据缓存数组ulCount:要写入的数据个数。
返 回:无。
备 注:当ulCount==1时是字节写,最多写一页8字节。
********************************************************************/
void Wr24c02a ( unsigned long ulMemAddr, unsigned char *pucBuffer, unsigned long ulCount )
{int i;g_bIICFlag = 0; //应答标志if ( ulCount > 8 ){DbgPrintX( DBG_IIC_LEVEL, "\rAT24c02a write number must blow 8 byte!\n");return; }rIICDS = DEV_ADDR;rIICCON &= ~0x10; //清中断标志rIICSTAT = 0xf0; //主设备发送模式while( !g_bIICFlag ) //等待从设备应答, udelay(10); //一旦进入IIC中断,即可跳出该死循环 g_bIICFlag = 0; rIICDS = ulMemAddr; //写入从设备内存地址rIICCON &= ~0x10;while( !g_bIICFlag )udelay(10);for ( i=0; i < ulCount; i++ ) {g_bIICFlag = 0; rIICDS = *( pucBuffer + i );rIICCON &= ~0x10;while( !g_bIICFlag )udelay(10);}rIICSTAT = 0xd0; //发出stop命令,结束该次通讯rIICCON = 0xaf; //为下次IIC通讯做准备mdelay(10); //等待
}/********************************************************************
函数功能:AT24c02a读函数。
入口参数:ulMemAddr:设备内存地址pucBuffer:IIC数据缓存数组ulCount:要读取的数据个数。
返 回:无。
备 注:当ulCount==1时是字节写,无最多读限制。
********************************************************************/
void Rd24c02a ( unsigned long ulMemAddr, unsigned char *pucBuffer, unsigned long ulCount )
{int i;unsigned char temp;/*发送设备地址(写操作)*/g_bIICFlag =0;rIICDS = DEV_ADDR; rIICCON &= ~0x10; //清中断标志rIICSTAT = 0xf0; //主设备发送模式while ( !g_bIICFlag )udelay(10);/*发送内存地址*/g_bIICFlag = 0;rIICDS = ulMemAddr;rIICCON &= ~0x10;while ( !g_bIICFlag )udelay(10);/*发送设备地址(读操作)*/g_bIICFlag = 0;rIICDS = DEV_ADDR; rIICCON &= ~0x10; rIICSTAT = 0xb0; //主设备接收模式while ( !g_bIICFlag )udelay(10);/*读到第一个数据是地址,丢弃*/g_bIICFlag = 0;temp = rIICDS; //读取从设备地址rIICCON &= ~0x10;while(!g_bIICFlag)udelay(10);/*连续读数据*/for ( i=0; i<ulCount; i++ ){g_bIICFlag = 0;if( i==ulCount-1 ) //如果是最后一个数据rIICCON &= ~0x80; //不再响应*(pucBuffer+i) = rIICDS;rIICCON &= ~0x10;while ( !g_bIICFlag )udelay(10);}rIICSTAT = 0x90; //结束该次通讯rIICCON = 0xaf; mdelay(10);
}/********************************************************************
函数功能:IIC测试函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void IICTest(void)
{int i, j;DbgPrintX( DBG_IIC_LEVEL, "\nIIC Test(Interrupt) using AT24C02\n");/*写操作*/DbgPrintX( DBG_IIC_LEVEL, "Write test data into AT24C02\n");memset ( pucIICBuffer, 0x49, 256);for(i=0 ;i<32; i++)Wr24c02a (0+8*i, pucIICBuffer[i], 8);memset ( pucIICBuffer, 0, 256);/*读操作*/ DbgPrintX( DBG_IIC_LEVEL, "Read test data from AT24C02\n");// for(i=0 ;i<32; i++)Rd24c02a (0, (unsigned char *)pucIICBuffer, 256);for(i=0;i<32;i++){for(j=0; j<8; j++)DbgPrintX( DBG_IIC_LEVEL, "%2x ", pucIICBuffer[i][j] );DbgPrintX( DBG_IIC_LEVEL, "\n");}rINTMSK |= BIT_IIC;
}
mini2440硬件篇之IIC相关推荐
- mini2440硬件篇之开篇词
对于以前玩单片机的人来说,对裸机编程一直都情有独钟,到了ARM9以上的cpu后,基本都跑操作系统,主流的是Linux,A8以后基本都跑Android,那么有没有必要再写裸机程序,这是一个争议的话题.以 ...
- mini2440硬件篇之Nand Flash
1. 硬件原理 Nand Flash在对大容量的数据存储中发挥着重要的作用.相对于Nor Flash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用Nand Flash时,往往要利用校验算 ...
- mini2440硬件篇之Nor Flash
1. 硬件原理 1.1. Nor Flash简介 NOR Flash是Intel在1988年推出的一款商业性闪存芯片,它需要很长的时间进行抹写,大半生它能够提供完整的寻址与数据总线,并允许随机存取存储 ...
- 如何学习嵌入式系统(硬件篇),含51单片机学习资料
学习嵌入式之前我们需要了解什么是嵌入式. (官方说法)嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用 ...
- linux usb3.0改2.0,TX1入门教程硬件篇-切换USB2.0与USB3.0
TX1入门教程硬件篇-切换USB2.0与USB3.0 说明: 介绍如何切换TX1USB口的为2.0或3.0版本 步骤: 编辑extlinux.conf文件,修改usb_port_owner_info= ...
- zed相机拆机_TX2入门教程硬件篇-外接双目相机ZED
TX2入门教程硬件篇-外接双目相机ZED 说明:介绍如何在TX2安装ZED双目相机 步骤:准备:接上显示屏,键盘和鼠标 刷机:TX2通过jetpack3.0需要采用full模式完成刷机 确保有CUDA ...
- 电脑基础知识精选(硬件篇)
电脑基础知识精选(硬件篇) 电脑基础知识 一.处理器 CPU 二.内存 RAM 三 .硬盘 Disk 四.显卡 GPU 五.主板 Motherboard 六.电源和显示器 七.选配电脑常见问答 八.如 ...
- Linux之旅----硬件篇
linux之旅----硬件篇(DIY) 记得第一次接触电脑应该是小学三年级,那时候的它对我来说只是一个游戏机的概念:极品飞车.红色警戒.CS.热血传奇.......陪我度过了小学懵懂的时光:泡泡堂.梦 ...
- zed相机拆机_TX1入门教程硬件篇-外接双目相机ZED
TX2入门教程硬件篇-外接双目相机ZED 说明:介绍如何在TX2安装ZED双目相机 步骤:准备:接上显示屏,键盘和鼠标 刷机:通过jetpack3.0需要采用full模式完成刷机 确保有CUDA8.0 ...
最新文章
- geohash java github_GitHub - GongDexing/Geohash: GeoHash是目前比较主流实现位置服务的技术,用最简洁的Java实现GeoHash算法...
- ios 沙盒 plist 数据的读取和存储
- Java中的泛型方法
- 有勇气的牛排---微信小程序
- __stdcall、__cdecl 、CALLBACK 几种函数修饰符
- android学习者优秀网址推荐
- java ip输入框_JavaScript实现IP地址的输入框方式
- python contains类似函数_Python也能做到Excel那样,条件统计轻松解决工作需求
- WCF(一) ---- 简单调用
- java 云服务器 linux,云服务器Linux部署JavaWeb项目
- 使用继电器制作振荡器
- CImage类的使用
- matlab u 上波浪线,波浪线如何居中,在excel中怎样输入在文字中部加波浪线
- 线性代数学习笔记——第三十二讲——向量混合积的概念与性质
- matlab elseif语句用法,Matlab if…elseif…elseif…else…end语句
- 糖果游戏(齐大第十一届校赛)
- Python练习猜拳,利用while循环自定义函数,结果数据存入excel表格
- Win11快捷键切换输入法无反应怎么办?快捷键切换输入法没有反应
- 英语语法学习--冠词
- 店铺提升流量有什么作用?用软件提升流量安全吗?
热门文章
- java 中利用subString 截取字符串中第三个/后面的内容,并将/用代替
- Serial Programming Guide for POSIX Operating Systems
- Not allowed to access normals on mesh ‘Combined Mesh (root: scene)‘ (isReadable is false...报错解决方法
- Addressable设置的要点
- 如何创作出优质的短视频文案?
- Unity 科大讯飞语音唤醒
- iOS各种被拒的原因汇总
- 计算机毕业论文基于Python实现的学生求职招聘兼职平台
- 利用mammoth.js将doc文档转为html
- Java web网站访问量的计数