您的位置 首页 电路

十 ARM9(2440)的IIC-理论知识及程序实例

概述S3C2440ARISC微处理器可以支持一个多主控IIC总线串行接口。一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)传递连接到IIC

概述

S3C2440A RISC 微处理器能够支撑一个多主控IIC 总线串行接口。一条专用串行数据线(SDA)和一条专用
串行时钟线(SCL)传递衔接到IIC 总线的总线主控和外设之间的信息。SDA 和SCL 线都为双向的。
多主控IIC 总线方法中,多个S3C2440A RISC 微处理器能够发送或接纳串行数据来自或到从设备。主机
S3C2440A 能够经过IIC 总线发动和结束数据传输。S3C2440A 中的IIC 总线是运用规范总线裁定进程。
为了操控多主控IIC 总线操作,有必要写入值到以下寄存器中:
– 多主控IIC 总线操控寄存器,IICCON
– 多主控IIC 总线操控/状况寄存器,IICSTAT
– 多主控IIC 总线Tx/Rx 数据移位寄存器,IICDS
– 多主控IIC 总线地址寄存器,IICADD
当释放了IIC 总线时,SDA 和SCL 线应该都坚持为高电平。一个高到低SDA 的改变能够发动一个开端条件。
SCL 安稳坚持在高电平时的一个低到高SDA 的改变能够发动一个中止条件。
开端和中止条件一般由主设备产生。第一个数据字节为7 位地址值,其在发动开端条件后放到总线上,能够确
定出主设备要挑选的从设备。第8 位是决议传输方向(读或写)。
每个放到SDA 线上的字节都应该总共为8 位。字节能够在总线传输操作期间无约束的发送或接纳。数据一般
从最高有用位(MSB)开端始发送,并且每个字节应该当即经过应对(ACK)位跟上。

I2C总线可构成多主和多从体系。在多主体系结构中,体系经过硬件或软件裁定取得总线操控运用权。运用体系中I2C总线多选用主从结构,即总线上只要一个主控节点,总线上的其他设备都作为从设备。I2C总线上的设备寻址由器材地址接线决议,并且经过拜访地址最低位来操控读/写方向。

现在,通用存储器芯片多为EEPROM,其常用的协议首要有两线串行衔接协议(I2C)和

三线串行衔接协议。带I2C总线接口的EEPROM有许多类型,其间AT24CXX系列运用非常遍及。产品包含AT24C01、AT24C02、AT24C04、AT24C08、AT24C16等。

AT24系列存储器芯片选用CMOS工艺制作,内置有升压电路,可在单电压供电条件下作业。其规范封装为8脚DIP封装方法。

各引脚的功用阐明如下:

SCL:串行时钟。遵从ISO/IEC7816同步协议,漏极开路,需接上拉电阻。在该引脚的上升沿,体系将数据输人到每个EEPROM器材,在下降沿输出。

SDA:串行数据线。漏极开路,需接上拉电阻。双向串行数据线,漏极开路,可与其他开路器材“线或”。

A0、A1、A2:器材/页面寻址地址输人端。在AT24C01和AT24C02中,引脚被硬衔接,其他AT24Cxx均可接寻址地址线。

WP:读/写维护。接低电平时可对整片空间进行读/写,高电平时不能读/写,受维护。

Vcc/GND:5V作业电压。

设备地址(DADDR)AT24C04的器材地址是1010。

AT24CXX的数据操作格局

在I2C总线中,对AT24C04内部存储单元读/写,除了要给出器材的设备地址(DADDR)

外,还须指定读/写的页而地址(PADDR)。两者组成操作地址(OPADDR)如下:

1010 A2 A1 A0-R/W,一般A2 A1 A0被硬衔接,比如是接地,所以设备地址便是0xa0

下面是我摘自他人的文章中关于IIC的描绘,写的很好

s3c2440内部有一个IIC总线接口,因而为咱们衔接带有IIC通讯模块的外围设备供给了便当。它具有四种操作方法:主设备发送方法、主设备接纳方法、从设备发送方法和从设备接纳方法。在这里咱们只把s3c2440作为IIC总线的主设备来运用,因而只介绍前两种操作方法。在主设备发送方法下,它的作业流程为:首要装备IIC方法,然后把从设备地址写入接纳发送数据移位寄存器IICDS中,再把0xF0写入操控状况寄存器IICSTAT中,这时等候从设备发送应对信号,假如想要持续发送数据,那么在接纳到应对信号后,再把待发送的数据写入寄存器IICDS中,铲除中止标志后,再次等候应对信号;假如不想再发送数据了,那么把0x90写入寄存器IICSTAT中,铲除中止标志并等候中止条件后,即完结了一次主设备的发送。在主设备接纳方法下,它的作业流程为:首要装备IIC方法,然后把从设备地址写入接纳发送数据移位寄存器IICDS中,再把0xB0写入操控状况寄存器IICSTAT中,这时等候从设备发送应对信号,假如想要接纳数据,那么在应对信号后,读取寄存器IICDS,铲除中止标志;假如不想接纳数据了,那么就向寄存器IICSTAT写入0x90,铲除中止标志并等候中止条件后,即完结了一次主设备的接纳。在完结上述两个方法时,首要用到了操控寄存器IICCON、操控状况寄存器IICSTAT和发送接纳数据移位寄存器IICDS。由于咱们只把s3c2440作为主设备来用,并且体系的IIC总线上只要这么一个主设备,因而用来设置从设备地址的地址寄存器IICADD,和用于裁定总线的多主设备线路操控寄存器IICLC都无需装备。寄存器IICCON的第6位和低4位用于设置IIC的时钟频率,由于IIC的时钟线SCL都是由主设备供给的。s3c2440的IIC时钟源为PCLK,当体系的PCLK为50MHz,而从设备最高需求100kHz时,能够将IICCON的第6方位1,IICCON的低4位全为0即可。寄存器IICCON的第7位用于设置是否宣布应对信号,第5位用于是否使能发送和接纳中止,第4位用于中止的标志,当接纳或发送数据后必定要对该位进行清零,以铲除中止标志。寄存器IICSTAT的高2位用于设置是哪种操作方法,当向第5位写0或写1时,则表明结束IIC或开端IIC通讯,第4位用于是否使能接纳/发送数据。

由于通讯是两边的工作,在了解了主设备的操作方法后,还要清楚从设备的运行机制,两者要到达完美地结合,才干完结互相的通讯。在这里,从设备是EEPROM——AT24C02A,要想让s3c2440能够正确地对AT24C02A读写,就有必要让s3c2440的时序彻底依照AT24C02A的时序。AT24C02A的写操作有两种方法:字节写和页写。字节写是先接纳带有写指令的设备地址信息,假如契合就应对,再接纳设备内存地址信息,宣布应对后,再接纳要写入的数据,这样就完结了字节写进程。页写与字节写的差异便是,页写能够一次写多个数据,而字节写只能一次写一个数据。但由于AT24C02A的一页才8个字节,所以页写也最多写8个数据,并且只能在该页内写,不会产生一次页写一起写两页的状况。AT24C02A的读操作有三种方法:当时地址读、随机读和序列读。当时地址读是只能读取当时地址内的数据,它的时序是先接纳带有读指令的设备地址信息,假如契合就应对,然后发送当时地址内的数据,在没有接纳从主设备发来的应对信号的状况下停止该次操作。随机读的时序是,接连接纳带有写指令的设备地址信息和设备内存地址信息,然后主设备从头敞开IIC通讯,AT24C02A再次接纳到带有读指令的设备地址信息,在宣布应对信号今后,发送该内存地址的数据,在没有接纳到任何应对信号的状况下结束该次通讯。当时地址读和随机读一次都只能读取一个数据,而序列读一次能够读取若干个数据,它的时序便是在当时地址读或随机读宣布数据后,接纳到了应对信号,那么AT24C02A会把下一个内存地址中的数据送出,除非AT24C02A接纳不到任何应对信号,不然它会一直把下一个内存地址中的数据送出。序列读没有一页8个字节的约束。

在介绍完了s3c2440和AT24C02A的IIC通讯方法后,咱们就能够写程序了。在这里,咱们用UART来完结PC机对AT24C02A的读写。UART的通讯协议是,PC机先发送指令字节:0xC0表明要向AT24C02A写数据,0xC1表明要读取AT24C02A的数据,在指令字节后,紧跟着的是设备内存地址和写入或读取的字节数。假如是要写EEPROM数据,则在这三个字节后是要写入的数据内容。在UART通讯结束后,s3c2440会依据指令的不同,写入或读取AT24C02A,假如是读取EEPROM,则s3c2440还会运用UART把读取到的数据上传到PC机。在这个程序中,咱们只敞开了UART的接纳中止,而没有敞开发送中止,即让s3c2440自动去完结发送使命。并且在与AT24C02A操作中,咱们运用的是页写和序列读的方法,这样能够最大程度的完结一次读或写操作,并且咱们所编写的页写和序列读子程度也相同能够完结字节写和随机读的方法。在这里咱们约束一次读或写的数据量最多为8个字节。

下面是用FL2440开发板的程序剖析:

#include
#include “2440addr.h”
#include “def.h”
#include “IIC.h”

static U8 _iicData[IICBUFSIZE];
static volatile int _iicDataCount;//发送计数标志
static volatile int _iicStatus;//IIC状况标志
static volatile int _iicMode;//IIC方法标志
static int _iicPt;
extern void Uart_Printf(char *fmt,…);
extern void Uart_Init(int baud);
void Delay(int x);

//===================================================================
//SMDK2440 IIC configuration
//GPE15=IICSDA, GPE14=IICSCL
//“Interrupt mode” for IIC block
//===================================================================

//******************[ Test_Iic ]**************************************
void Test_Iic(void)
{

unsigned int i,j,save_E,save_PE;
static U8 data[512];//256
//Uart_Init(115200);

Uart_Printf(“nIIC Test(Interrupt) using AT24C02n”);

save_E= rGPECON;
save_PE= rGPEUP;
rGPEUP|= 0xc000;//Pull-up disable

rGPECON &=0xfffffff;
rGPECON |= 0xa0000000;//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 delayadded by junon
rIICDS = 0xDD;
Uart_Printf(“Write test data into AT24C02n”);

for(i=0;i<256;i++)//256
Wr24C080(0xa0,(U8)i,i);//向地址0–255写入数据0–255

for(i=0;i<256;i++)//256
data[i] = 0;//数组清零

Uart_Printf(“Read test data from AT24C02n”);

for(i=0;i<256;i++)
Rd24C080(0xa0,(U8)i,&(data[i]));//将读取的数据存入data数组

//Line changed 0 ~ f
for(i=0;i<16;i++)//打印读取的数据16
{
for(j=0;j<16;j++)
Uart_Printf(“%2x “,data[i*16+j]);
Uart_Printf(“n”);
}
rINTMSK |= BIT_IIC;//屏蔽中止
rGPEUP= save_PE;//康复GPE口
rGPECON = save_E;
while(1);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/256926.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部