2440通过I2C总线连接设备(AT24Cxx),芯片内部有一个I2C控制器。
当主机(2440)Master为Transmitter时,从机Slave为Receiver,当主机Master为Receiver时,从机Slave为Transmitter。
下图是2440的I2C总线框图。从左往右看,首先是I2C的时钟,I2C的时钟源是PCLK(50MHz),经过一个4bit的分频器,产生I2C的时钟。通过IICSTAT寄存器发出信号,通过IICDS发送数据或接受数据。
数据的传输格式如下图如所示。首先发出开始信号S,然后是7位的从设备地址,1位的读写标志位,然后等待从机返回一个ACK信号,如果是发送数据,那么就将1B数据发出,然后等待从设备回传ACK,如果是接受,那么就接收从设备返回的1B的DATA数据,然后给从设备发送一个ACK信号,如果要结束传输,就使用一个P信号来结束。
在第九个时钟信号产生了中断,在中断处理过程中,SCL为低,谁都不可以使用I2C。
那么,在中断中做什么呢?
对于写,如果没有ACK,则出错,要结束传输(发出P信号);若有ACK,那么说明传输成功,这时若仍有数据,则继续写入IICDS,并清中断,若无数据要传输,则发出结束信号;
对于读,收到数据后要回应一个ACK信号,若还有数据要读,则清中断,启动下一次传输;若不想读了,则发送结束标志。
**重点:发生IIC中断时,SCL被拉低,阻止继续使用IIC,清中断后,才可以继续使用。**这种机制给我们的IIC控制器提供了处理时间。
下面是2440手册中,读写的操作说明。
在Transmitter模式,当数据发送完毕后,IIC总线将等待IICDS寄存器接收一个新数据。在新数据写入到IICDS寄存器之前,SCL被拉低,写入新数据后再被释放。2440要进入中断,来确定当前数据是否发送完成。在2440处理完中断后,要向IICDS寄存器写入下一个数据。
IICDS = val;
发送完成,产生中断,要拉低SCL;
中断程序中,判断状态,IICDS = val,IIC继续工作;
在Receive模式,当数据接受完毕,IIC总线接口要等待IICDS寄存器被读取。在新数据被读取之前,SCL被拉低,只有在数据被取出后,SCL才被释放。2440要进入中断来保证新数据是否读取完成。在CPU收到一个中断请求之后,需要从IICDS寄存器中读取数据。
发起传输,接受DATA;
产生中断,SCL被拉低;
中断程序中,判断;判断并处理之后,val = IICDS,IIC继续工作,继续接受新数据;
关键字:I2C S3C2440 I2C控制器
引用地址:
1.10.2_I2C_S3C2440的I2C控制器_P
推荐阅读最新更新时间:2024-11-11 10:22
I2C总线信号时序总结
总线空闲状态 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
启动信号 在时钟线SCL保持高电平期间,数据线SDA上的电平被拉低(即负跳变),定义为I2C总线总线的启动信号,它标志着一次数据传输 的开始。启动信号是一种电平跳变时序信号,而不是一个电平信号。启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态。
重启动信号 在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放
[嵌入式]
s3c2440栈分配情况(fl2440裸机 stack)
//2440INIT.S ;The location of stacks UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~ UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~ AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~ IRQStack EQU (_STACK_BASEADDRESS-0x1000)
[单片机]
STM8硬件I2C事件锁死
前言: 之前我使用STM8的硬件IIC通信卡死在判忙,专门写了一篇注意事项。这个周又使用,对之前的理解注意事项又有了更深刻的理解。 上一篇,IO口状态设置不对,会使IIC不能正常工作。本质上我也没想明白,这一次使用又使用,结果碰到了更难理解的问题,直接把STM8复位都不能恢复正常。倒是更加深了之前为什么IO设置不对会是硬件I2C不能正常工作的理解。 当把I2C 数据脚设置为输出低的时候,I2C总线会认为外部器件把总线占用了,所以不能正常使用。 来说说,最近碰到的IC复位都不能解决的问题,只能通过长时间断电,来解决。最后万能的网友提供了IO操作模拟一个结束信号,可以达到修复总线的效果。更进一步查,STM32也有这样的问题
[单片机]
S3C2440 SDRAM寄存器初始化设置
板子是s3c2440,使用两片容量为32MB、位宽16bit的EM63A165TS-6G芯片拼成容量为64M、32bit的SDRAM存储器。根据2410datasheet,要使用SDRAM需配置13个寄存器,以下逐个来看: 1、 BWSCON:Bus width & wait status control register总线位宽和等待状态控制寄存器。 此寄存器用于配置BANK0 – BANK7的位宽和状态控制,每个BANK用4位来配置,分别是: ● ST(启动/禁止SDRAM的数据掩码引脚。对于SDRAM,此位置0;对于SRAM,此位置1) ● WS(是否使用存储器的WAIT信号,通常置0为不使用) ● DW(两位,设置位宽。此
[单片机]
S3C2440 Linux驱动移植——NAND驱动
开发板:TQ2440 内核:Linux 2.6.32 PC OS:Ubuntu 11.04 本文将对NAND驱动的移植进行简单介绍。其中,将对NAND控制器所需要的参数进行详细说明。 1. 修改分区表 打开文件arch/arm/plat-s3c24xx/common-smdk.c,修改mtd_partition结构体数组。 修改后如下: static struct mtd_partition smdk_default_nand_part = { = { .name = Uboot , .size = 0x00040000, .offset = 0x00000000,
[单片机]
有关I2C占空比寄存器设置问题
疑问: ----------------------------------------------------------------------- I2C0SCLH = (Fpclk/fi2c + 1) / 2; I2C0SCLL = (Fpclk/fi2c)/2; 在I2C0SCLH = (Fpclk/fi2c+ 1) / 2;里, 为什么是Fpclk/fi2c + 1而不是Fpclk/fi2c? ----------------------------------------------------------------------- 解答: *************************************
[单片机]
OpenCV2.0.0移植到ARM9(三)(JZ2440----S3c2440)
在前面已经交叉编译生成了OpenCV的库,libjpeg相关的库。下面尝试OpenCV应用程序编写与交叉编译。 1、opencv测试程序 test.cpp程序代码: #include stdio.h #include highgui.h #include imgproc.h int main(int argc,char *argv ) { IplImage* img = cvLoadImage( abc.jpg ); cvNamedWindow( Example1 , CV_WINDOW_AUTOSIZE); cvShowImage( Example1 , img); cvWaitKey(
[单片机]
PIC单片机之I2C总线
大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232 串口、步进电机、温度传感器等资源,体会到了学习板的易用性与易学性,看了前几期实例,当你实验成功后一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下I2C 总线的工作原理及使用方法,这样我们可以将一些我们要保存的数据存储到I2C总线的非易失存储器中,实现断电保持的功能,比如:你设置了一个密码,但不至于这个设备断过电以后就要重新设置过,我们可以将密码数据写在非易失存储器里面,还有如汽车的量程表的读数是不断累计的,可以通过不断访
[单片机]