历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2019年12月16日 | ARM——I2C

2019-12-16 来源:eefocus

  S5PC100的RISC微处理器支持多主机I2C总线串行接口。一个专用的串行数据线(SDA)和一个串行时钟线(SCL)在总线主机和连接到I2C总线的外围设备之间传递信息。SDA和SCL线是双向的。


  在多主机i2c总线模式中,多个微处理器发送到从机设备或从从机设备接收。主机S5PC100启动和终止一个在I2C总线上的数据传输。S5PC100上的I2C总线使用标准总线仲裁程序。


  为了控制多主机I2C总线操作,值必须写到一下寄存器:

  多主机I2C控制寄存器 I2CCON

  多主机I2C控制/状态寄存器 I2CSTAT

  多主机I2C发送/接收转换寄存器 I2CDS

  多主机I2C地址寄存器 I2CADD


  如果I2C总线空闲,SDA和SCL线应该均为高电平。当SCL线稳定在高电平时,SDA线电平由高到低转换将发起开始条件,SDA线电平由低到高转换将发起停止条件。


  主机设备总是产生开始条件和停止条件。当开始条件发起后,被放到总线上第一数据字节的7位地址值能够决定总线主机设备选择的从机设备。第8位决定传输方向(读/写)。


  每一个被放到SDA线上的数据字节应该是总共八位。总线传输期间发送或接收的数据字节数没有限制。数据总是首先从最高有效位MSB发送,每一字节后紧跟应答位ACK。

 

  S5PC100 I2C总线接口有四种操作模式:

  主机发送模式;主机接收模式;从机发送模式;从机接收模式


这些操作模式功能关系:

开始和停止条件

  如果I2C总线接口未启动,通常是从机模式。换句话说,接口在检测到SDA线上开始条件(当SCL线时钟信号高电平时SDA线电平由高到低转换发起开始条件)之前应该是从机模式。如果接口状态转换到主机模式,SDA线上数据传输可以被发起,SCL信号产生。


  通过SDA线开始条件传输一字节串行数据,停止条件终止数据传输。当SCL线时钟信号高电平时SDA线电平由低到高发起停止条件。主机产生开始和停止条件。如果开始条件产生,I2C总线将变为忙状态。停止条件释放I2C总线。如果主机发起开始条件,应该发送一个从机地址来通知从机设备,一个字节的地址域包含一个7位地址值和一个1位传输方向指示值(写或读)。如果第8位是0,则表示写操作(发送操作);如果第8位是1,则表示读数据请求(接收操作)。


  主机发送停止条件来完成传输操作,如果主机箱继续总线数据的发送,应该产生另一个开始条件和从机地址。这样,可以进行各种格式的读写操作。

 

数据传输格式 

SDA线上的每一字节应该长度为8位,每次传输发送的字节数没有限制。跟随开始条件的第一字节应该包含地址域。如果I2C总线操作在主机模式下,主机发送地址域。每一字节后应该紧跟一个应答位ACK。串行数据和地址的最高有效位MSB应该首先被发送。

应答信号发送

为了完成一字节传输操作,接收方发送应答位ACK到发送方。应答脉冲在SCL线的第9时钟周期产生。一字节数据传输使用了八个时钟。主机发送应答位ACK要产生时钟脉冲。

 

发送方如果接收到应答位ACK则通过使SDA线置高来释放SDA线。接收方在应答位ACK时钟脉冲期间驱使SDA线置低以使在SCL线第9脉冲周期间保持SDA线置低。

软件(I2CSTAT)使能或禁用应答位ACK发送功能。然而,在SCL线第9脉冲周期应答位ACK脉冲被请求来完成一字节数据传输操作。

 

 读/写操作

在发送模式下,如果数据被传输,I2C总线接口等待直到I2C总线数据转换寄存器(I2CDS)接收到一个新的数据。在新数据写到寄存器之前,SCL线保持低电平,然后写完之后释放。S5PC100获得中断来识别当前数据发送是否完成。CPU接收中断请求之后,再写一个新数据到I2CDS寄存器。


在接收模式下,如果数据被接收,I2C总线接口等待直到I2C总线数据转换寄存器(I2CDS)被读到。在新数据被读出之前,SCL线保持低电平,然后读完释放。S5PC100获得中断来识别当前数据接收是否完成。CPU接收中断请求之后,再从I2CDS寄存器读数据。

总线仲裁程序

仲裁发生在SDA线上来阻止总线上两主机冲突,如果一个SDA线高电平的主机检测到另一个SDA线低电平的主机,它将不发起数据传输,因为总线上的当前电平不能对应到他自己,仲裁程序延迟直到SDA线电平变高。


如果主机同时降低SDA线电平,没一个主机评估是否主控权在它自身。为了评估每一个主机检测地址位。当每一主机产生从机地址时,检测SDA线上的地址位,因为SDA线很可能获得低电平而不是保持高电平。假设一个主机产生低电平作为地址第一位,而另一个主机维持在高电平,这种情况,两主机检测到总线上低电平,因为低电平状态优于高电平状态。如果发生,产生低电平(作为地址第一位)的主机获得主控权而产生高电平(作为地址第一位)的主机撤出主控权。如果量主机产生低电平作为地址第一位,再对第二地址位仲裁。这种仲裁持续到地址位结束。

 

中止条件

如果从机接收方不能应答从机地址的确认,将保持SDA线高电平。这种情况,主机产生停止条件然后中止传输。


如果主机接收方忙于中止的传输,则通过在从机接收完最后的数据字节后取消产生应答位ACK来发信号中止从机发送。从机发送方释放SDA线来允许主机产生停止条件。

 

配置I2C总线

  

为了控制串行总线时钟SCL的频率,4位预分频值被写进I2CCON寄存器。I2C总线接口地址保存在I2C总线地址(I2CADD)寄存器(默认情况下I2C总线接口地址有一个未知值)。


每个模式下的操作流程图

下面的步骤在每一个I2C发送/接收操作中都被执行

1如果需要,自己的从机地址到I2CADD寄存器


2设置I2CCON寄存器

  a使能中断

  b定义SCL周期


3设置I2CSTAT为使能串口输出


#include "s5pc100.h"

void putc(const char data)
{
 while(!(UART0.UTRSTAT0 & 0X2));
 UART0.UTXH0 = data;
 if(data == 'n')
  putc('r');
}
void puts(const  char  *pstr)
{
 while(*pstr != '')
  putc(*pstr++);
}

void uart0_init(void)
{
 GPA0.GPA0CON = (GPA0.GPA0CON & ~(0xff)) | 0X22;//enable GPA0.0 GPA0.1 pin function mode // RXD0 TXD0
    UART0.UFCON0 = 0X00; //disable  fifo
 UART0.UMCON0 = 0X00; //disable AFC
 UART0.ULCON0 = 0X03; //data length 8 bit
 UART0.UCON0  = 0X305; //
 UART0.UBRDIV0 = 0X23; // Baud rate divisior register 115200   UBRDIV0 = (PCLK / (bps x 16 ) ) 
 UART0.UDIVSLOT0 = 0xDDD5;   //set  SLOT  register  generate more accurate baud rate
    printf("open uart device ok !n");
}

 

 #include "s5pc100.h"
#include "uart.h"

/****
 * functioal : Reading the value of the internal lm75 register
 * param:  address register of the internal lm75 register
 * return: value of the internal lm75 register
 */
int set_pointer_and_read_temperature(void)

 int delay;
 int low, high;
 I2C0.I2CDS0 = 0x90;       /*LM75 SLAVE ADDRESS */
 I2C0.I2CCON0 = 0xe0;       /*ENABLE ACK BIT, PRESCALER:512 ,RX/TX INTERRUPT ENABLE ,*/
 I2C0.I2CSTAT0 =0xf0;       /*Master Trans mode ,START ,ENABLE RX/TX ,*/
 while(!(I2C0.I2CCON0&(1<<4)));  /*The end of the waiting to be sent  */
 
 I2C0.I2CDS0 = 0x0;        /*pointer register Temperature(read only) send address of SFR in the lm75*/
 I2C0.I2CCON0 &= ~(1<<4);        /* Clear pending condition & Resume the operation */
 while(!(I2C0.I2CCON0&(1<<4)));  /*The end of the waiting to be sent  */
 
 I2C0.I2CDS0 = 0x90;            /*Again to send LM75 salve address*/
 I2C0.I2CSTAT0 =0xb0;     /*Master receive mode ,START ,ENABLE RX/TX ,*/
 I2C0.I2CCON0  &= ~(1<<4);    /* Clear pending condition & Resume the operation */
 while(!(I2C0.I2CCON0&(1<<4))); /*The end of the waiting to be sent  */

 I2C0.I2CCON0 &= ~(1<<4);        /* Clear pending condition & Resume the operation */
 for(delay=0; delay<0xffff; delay++);
 high = I2C0.I2CDS0;             /*read temperature of high 8 bit */

 

 I2C0.I2CCON0 &= ~(1<<4);       /* Clear pending condition & Resume the operation */
 for(delay=0; delay<0xffff; delay++); 
 low = I2C0.I2CDS0;    /*read temperature of low 1 bit */

 I2C0.I2CSTAT0 &= ~(1<<5);   /*STOP signal generation,free bus */
 I2C0.I2CCON0 &= ~(1<<4);  /*clean interrup pending bit  */
 return ((high << 8) | low);
}

int main()
{
 int temp;
    int low, high;
    uart0_init();
    GPD.GPDCON = (GPD.GPDCON & ~(0X0F << 12)) | (0X2 << 12);  /*SDA  set gpd[3] functional mode*/
    GPD.GPDCON = (GPD.GPDCON & ~(0X0F << 16)) | (0X2 << 16);  /*SCL  set gpd[4] functional mode*/

 while (1){
  temp = set_pointer_and_read_temperature();
  high = temp >> 8;
  low = temp & 0xff;
     printf("TEMP is : %d.%dn", high, (((low>>7)==0) ? 0 : 5)); 
 }
 return 0;
}


推荐阅读

史海拾趣

ABLIC公司的发展小趣事

在过去的六年里,ABLIC实现了高盈利,这得益于其不断创新的产品线和市场策略。为了进一步拓展业务,ABLIC将目光投向了欧洲市场。欧洲作为全球电子产业的重要区域,对于模拟半导体的需求持续增长。ABLIC凭借其在小型、低功耗和精确模拟半导体产品方面的优势,积极在欧洲市场寻求合作机会,为公司的长远发展奠定了坚实基础。

AirBorn公司的发展小趣事

AirBorn公司成立于1958年,总部位于得克萨斯州奥斯汀。在创立之初,AirBorn就致力于设计、制造和销售高性能连接器和电缆组件。随着电子技术的飞速发展,AirBorn敏锐地捕捉到航空航天领域对高性能连接器的需求,并开始了针对这一领域的定制化产品研发。凭借卓越的技术实力和创新能力,AirBorn很快在航空航天连接器市场占据了一席之地。

顺芯(Everest-semi)公司的发展小趣事

随着技术的不断进步,顺芯公司意识到只有不断创新才能在激烈的市场竞争中立于不败之地。因此,公司加大了在研发方面的投入,积极引进高端人才,并与国内外知名高校和研究机构建立了合作关系。在XXXX年,顺芯公司成功研发出了一款具有自主知识产权的高性能数模混合芯片,填补了国内市场的空白,并获得了多项专利。

Bussmann (Eaton)公司的发展小趣事

随着电子技术的快速发展,对电路保护的要求也越来越高。为了满足市场需求,Bussmann于1992年开始研发芯片保险丝。这款新型保险丝将可熔性材料沉降到陶瓷基底上,具有体积小、安装方便等优点,能够广泛应用于印刷电路板等电子设备中。芯片保险丝的推出不仅进一步提升了Bussmann的技术实力,也为其在电子行业打开了新的市场空间。

General Instrument公司的发展小趣事
使用电压表测量电路上的电压,确认是否在正常范围内。
Custom Components Inc公司的发展小趣事

在电子行业快速发展的背景下,客户对电子元件的定制化需求日益增长。CCI敏锐地捕捉到了这一市场趋势,迅速调整战略方向,将业务重心转向客户定制化服务。

为了满足客户多样化的需求,CCI加强了与客户的沟通与合作,深入了解客户的具体需求和应用场景。公司不仅提供标准产品,还能根据客户的特殊需求进行定制化设计和生产。这种服务模式赢得了客户的广泛认可,CCI的市场份额也随之稳步提升。

问答坊 | AI 解惑

简化的6通道串行通讯板怎么设计?

以下设计题中,主CPU芯片均采用ATMega128L-8AU,供电电源为12V DC。 1. ATMega128L的工作电源为2.7V~5.5V DC,因此需要为CPU设计一个合适的电源系统,请使用LM2576-ADJ设计一个三端稳压电路,输出5V DC/3A供整个设计使用,需要设计电源指示灯 ...…

查看全部问答>

乔布斯你凭什么这么牛?

最近IT业的人没有不知道iPhone 4的信号门,为此展开的口水战也屡见于各大媒体。“信号门”本不是什么好事,对于其他公司甚至可能是灭顶之灾,但苹果有个乔布斯,信号门不仅乔布斯出尽风头,出现在各大媒体头版头条,iPhone 4手机的销售也好像丝毫没 ...…

查看全部问答>

MTK6225 手机开发板(含源代码)

MTK6225 手机开发板(含源代码) 有诚意者请联系 Qq:296662705 硬件特性: 1、 CPU:mtk6225 2、 TFLASH 卡接口 3、 176X220 2.6寸TFT LCD,最高支持320*240*16的TFT LCD 4、 4线触摸屏接口 5、 双声道音频输出 6、 一个Camera 130万像素 ...…

查看全部问答>

嵌入式设备里,添加java游戏,如何支持Java?

因为手头的开发板是mips32+linux,嵌入式设备里,想添加java游戏,应该移植哪种JVM比较好,比较快,比较容易?据说kaffe是一个不错的JVM,有没有移植过的朋友,可以参考指点的,谢谢!…

查看全部问答>

问问linux、嵌入式行业的开发人员

总说linux开发或者linux下的嵌入式开发,尽管在网上能搜罗到不少相关的信息,但总归没有一个清晰的概念和界定。 究竟在实际工作中是哪些东西的开发?分为哪几种?需要什么知识? 注:小弟我现在做java,由于对底层的偏爱,想转底层开发,学习 ...…

查看全部问答>

有北京的朋友和我一起买扬创s3c2440的板子吗 ?

有北京的朋友和我一起买扬创s3c2440的板子吗 http://www.yctek.com/shop/view_47.html 团够就可以便宜的。有意思的朋友可以留言。我看了。比这个价格还要便宜好几百呢。人越多他们说越便宜。…

查看全部问答>

3.3V转5V,大家在实践中都用什么芯片

3.3V转5V,大家在实践中都用什么芯片?…

查看全部问答>

Xilinx FPGA & MATLAB SYSTEM GENERATOR FIR COMPILOR 调通了

基于MATLAB SYSTEM GENERATOR 的FIR滤波器终于调通了,模型如下: 参数如下:   输出波形如下图所示: 上图中,第一个波形是待滤波的波形,第二个是FIR数字滤波器的输出波形,第三个是MATLAB自带的滤波器。   然而,上述结果 ...…

查看全部问答>

IAR中跑的好好的,换到MDK中就会莫名其妙的进Fault中断,请各位帮忙看看!

下面的程序在IAR中用的好好的,但是自己有点吹毛求疵了,还是习惯用MDK,所以就转到MDK下用,程序什么的都不变,只是把对应的driverlab.a文件换成了对应的driverlib.lib文件,build没有问题,下载进去也没问题,前面的串口输出也没问题,但程序一跑 ...…

查看全部问答>

任务栈空间检测机制(rtos使用者必看)

目前绝大部分的rtos都是没有基于mmu或者mpu来运行的,也就是说没有内存保护机制。在没有内存保护机制的前提下,最揪人心的莫过于任务栈空间的溢出了,任务栈空间的溢出随时就像一颗定时炸弹等着引爆,使用者浑身不自在。有没有100%的任务栈空间溢出 ...…

查看全部问答>