IIC读写AT24Cxx (S3C2440)

发布者:peon1989最新更新时间:2019-05-10 来源: eefocus关键字:IIC读写  AT24Cxx  S3C2440 手机看文章 扫描二维码
随时随地手机看文章

IIC(Inter-Integrated Circuit,I2C)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微处理器及其外围设备,它的最主要优点是简单和有效。它只需要数据线SDA和时钟线SCL,就能够实现CPU与被控IC之间、IC与IC之间进行双向传送。

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个字节。

以上转自:
作者:zhaocj
来源:CSDN
原文:https://blog.csdn.net/zhaocj/article/details/5477152
版权声明:本文为博主原创文章,转载请附上博文链接!

在发送模式:
1.往寄存器IICDS寄存器放入一个val值。
2.发完,产生中断,并且会把 SCL拉低。
3.在中断程序里,判断状态,然后往IICDS里面写入下一个数据,一旦写入下一个数据IIC继续操作,若再次发完,就会再次产生中断。
在接受模式:
1.我的程序发起传输,接受数据。
2.接收到数据之后,产生中断,SCL被拉低。
3.中断程序里,判断数据是否要继续接受等,如果还有继续接受的话,再次设置,设置好之后读IICDS寄存器,一但读出来IIC。
继续接受下一个数据,收到新数据之后,又会产生一个中断(就是这样循环操作)。

按照S3C2440的IIC传输流程图
在这里插入图片描述
在这里插入图片描述
和AT24Cxx的传送模式
在这里插入图片描述
在这里插入图片描述
ARM每传完一个数据就进入一次中断,所以,在中断服务程序中清中断。下次传输时还要清除IICCON的bit4的中断标志位。

/*

###  i2c_drive文件

###  包括,初始化i2c,读i2c,写i2c,i2c中断处理函数


*/


#include "i2c_drive.h"



#define AT24Cxx_ADDR 0x50


unsigned char ask = 1; //应答标志位,0表示应答成功


static void delay(unsigned int time)

{

for (; time>0; time--);

}


void i2c_init(void)

{

/* GPE15--IICSDA, GPE14--IICSCL */

GPECON &= ~((3<<28) | (3<<30));

GPECON |= (2<<28) | (2<<30);

/* 设置IICCON总线控制寄存器 */

/* [7] : IIC-bus acknowledge enable bit, 1-enable in rx mode

* [6] : 时钟源, 0: IICCLK = fPCLK /16; 1: IICCLK = fPCLK /512

* [5] : 1-enable interrupt

* [4] : 读出为1时表示中断发生了, 写入0来清除并恢复I2C操作

* [3:0] : Tx clock = IICCLK/(IICCON[3:0]+1).

* Tx Clock = 100khz = 50Mhz/16/(IICCON[3:0]+1)

*/

IICCON = 0xe0;

IICSTAT = 0x10;

INTMSK &= ~(1<<27);

}



void i2c_interrupt(void)

{

/* 清除中断标志位 */

SRCPND &= ~(1<<27);

INTPND &= ~(1<<27);

ask = 0;

}


void write_at24cxx(unsigned char addr, unsigned char *buffer, int sizeofdate)

{

int i;

ask = 1;

IICDS = AT24Cxx_ADDR;

IICCON &= ~(1<<4); //清中断

IICSTAT = 0xf0; //配置为主机发送模式,发出S信号,

//IICDS寄存器中的数据自动发出,使能串行发送接收功能

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

ask = 1;

IICDS = addr; //发送设备内存地址

IICCON &= ~(1<<4); //清中断

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

for (i=0; i {

ask = 1;

IICDS = *(buffer+i);

IICCON &= ~(1<<4); //清中断

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

}

IICSTAT = 0xd0; //发送P

IICCON = 0xe0;

delay(100);

}



void read_at24cxx(unsigned char addr, unsigned char *buffer, int sizeofdate)

{

int i;

unsigned char temp;

ask = 1;

IICDS = AT24Cxx_ADDR;

IICCON &= ~(1<<4); //清中断

IICSTAT = 0xf0; //配置为主机发送模式,发出S信号,

//IICDS寄存器中的数据自动发出,使能串行发送接收功能

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

ask = 1;

IICDS = addr; //发送设备内存地址

IICCON &= ~(1<<4); //清中断

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

ask = 1;

IICDS = AT24Cxx_ADDR; //发送设备内存地址

IICCON &= ~(1<<4); //清中断

IICSTAT = 0xb0; //主设备接收模式

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

ask = 1;

temp = IICDS;

IICCON &= ~(1<<4); //清中断

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环


for (i=0; i {

ask = 1;

if (i == sizeofdate-1)

IICCON &= ~(1<<7); //ACK信号禁止

*(buffer+i) = IICDS;

IICCON &= ~(1<<4); //清中断

while (ask == 1) //等待从设备应答

delay(100); //一旦应答,进入中断使得ASK=0,则跳出该死循环

}

IICSTAT = 0x90; //发送P

IICCON = 0xe0;

delay(100);

}


关键字:IIC读写  AT24Cxx  S3C2440 引用地址:IIC读写AT24Cxx (S3C2440)

上一篇:KEIL / MDK生成BIN文件
下一篇:对LCD的操作(S3C2440)

推荐阅读最新更新时间:2024-11-07 16:14

s3c2440裸机-norflash3-uboot中操作norflash
前提: norflash初始化正常,能够正常从nor上执行。 cpu总是从0地址读取指令执行程序。当cpu设置成nor启动时,0地址对应nor。cpu从nand启动时,0地址对应sram。 1.读取norFlash 我们将板子设为nor启动,那么0地址对应nor,我们先将uboot烧写到nor中。我们先看下这款NorFlash的手册,找到操作flash的命令表: 下面简单的举一些例子: 1)复位(reset): 往任何一个地址写入F0即可。 2)读ID: 很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte),我们这款norflash数据位宽为16bit。下面我们按照nor手册上的命令表尝
[单片机]
代码重定位
1 说明 实验平台: JZ2440 CPU: S3C2440 2 S3C2440的启动过程 图1 S3C2440A Memory Map after Reset S3C2440支持从多种存储设备启动:NOR/NAND Flash, EEPROM, 等等。芯片内部有4K SRAM用于启动设备使用。至于,设备最终以哪一种方式启动,通过配置芯片的OM引脚,由芯片内部实现。 摘自《S3C2440A_UserManual_Rev13》: 图2 BANK0 BUS WIDTH 举个例子,当选择以NOR Flash的方式启动时,芯片的0地址(4K地址空间)会直接映射到Nor Flash上,
[单片机]
代码重定位
MSP430F149模拟IIC读写24C02程序
板子上设置了EEPROM存储器,型号为AT24C02。 板子的硬件连接为:SCL--- P2.4,SDA--- P2.5。 直接了当,贴上程序! ========================24cxx.h文件=========================#ifndef _24CXX_H_#define _24CXX_H_#include msp430x14x.h #define WRITE_ADDR 0xA0 //A0 A1 A2均接地#define READ_ADDR 0xA1 //A0 A1 A2均接地#define SDA_BIT BIT5#define SCL_BIT BIT4#define IIC_P
[单片机]
MSP430F149模拟<font color='red'>IIC</font><font color='red'>读写</font>24C02程序
基于FFmpeg的远程视频监控系统编解码
0 引言 随着视频编解码技术、计算机网络技术、数字信号处理技术和嵌入式系统的发展,以嵌入式网络视频服务器为核心的远程视频监控系统开始在市场上崭露头角。该系统把摄像机输出的模拟视频信号通过内置的嵌入式视频编码器直接转换成视频流,通过计算机网络传输出去。嵌入式网络视频服务器具备视频编码处理、网络通信、系统控制等强大功能,直接支持网络视频传输和网络管理,使得监控范围达到前所未有的广度。在远程视频监控系统中,摄像头获取的原始视频流在传输之前需要压缩,而FFmpeg可以将原始视频压缩为H264格式视频流,H264是一种被广泛使用的高精度视频的录制、压缩和发布格式,因此采用FFmpeg来实现。 1 系统方案 系统是在S3C2440平台上运行嵌
[单片机]
基于FFmpeg的远程视频监控系统编解码
s3c2440 linux lcd驱动解读
s3c2440 linux lcd驱动解读 驱动层即s3c2410fb.c定义platform_driver 如下面文件定义了s3c2410fb_driver: \linux\linux-2.6.29\drivers\video\S3c2410fb.c static struct platform_driver s3c2410fb_driver = { .probe = s3c2410fb_probe, .remove = s3c2410fb_remove, .suspend = s3c2410fb_suspend, .resume = s3c2410fb_resume, .driver = { .name = s3c2410-
[单片机]
S3C2440-LCD图片显示
折腾了几日,终于可以将图片显示在LCD上了,我使用的东华的WXCAT35-TG3#001 TFT LCD。首先使用PHOTOSHOP软件将图片改成宽320,高240,注意不要反了。然后用Image2Lcd_32软件提取出数组。我选的是24位真彩。所以一个像素3个字节,显示的时候,通过位运算将3个字节合到一起,显示在一个像素上。 Image2Lcd_32的配置方法: #include 2440addr.h #include picture.h //垂直同步信号的脉宽、后肩和前肩 #define VSPW 15 #define VBPD 3 #defi
[单片机]
S3C2440-LCD图片显示
S3C2440外部中断系统详解
S3C2440A中的中断控制器接受来自60个中断源的请求。提供这些中断源的是内部外设,如DMA控制器、UART、IIC等等。在这些中断源中,UARTn、AC97和EINTn中断对于中断控制器而言是“或”关系。任意一个中断发生都会触发总中断 当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T内核的FIQ或IRQ。 仲裁步骤由硬件优先级逻辑决定并且写入结果到帮助用户通告是各种中断源中的哪个中断发生了的中断挂起寄存器中。 中断源有两种,一种是直接中断源,比如触摸屏中断,还有一种是带子中断的中断,类似于串口带有子终端入RXTX中断,通过SUBMASK也就是中断允许之后挂起到系统,系统根据用户设置
[单片机]
<font color='red'>S3C2440</font>外部中断系统详解
S3C2440上移植FreeRTOS
简介: FreeRTOS-Kernel V10.5.1 | gcc version 6.5.0 (crosstool-NG 1.24.0) 在官方已有的ARM7_LPC2000的移植模板文件基础上修改(FreeRTOS-Kernel/portable/GCC/ARM7_LPC2000)使用heap4。 移植调度器: 初始化一个定时器用于提供系统心跳时钟。选择初始化定时器4的周期为1ms,配置为fiq。在prvSetupTimerInterrupt()中调用初始化函数如下图: 在vPortISRStartFirstTask()中添加汇编函数如下:目的是在启动第一个函数前切换处理器到特殊模式,简而言之就是要切换到非系统或用户模式,因
[单片机]
在<font color='red'>S3C2440</font>上移植FreeRTOS
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved