当前位置:首页 >> 信息与通信 >>

NUC100 How to access 24C64 via IIC V1.00


Application Note of NUVOTON 32-bit NuMicro Family

Application Note
32-bit Cortex-M0 MCU NuMicro Family

I2C EEPROM应用指南

AN_1009_SC -i-

March 11

, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

目录
1 2 3 简介 ............................................................................................................................................. 2 I2C 性能....................................................................................................................................... 2 I2C 功能描述 ............................................................................................................................... 3 3.1 3.2 3.3 3.4 3.5 3.6 4 5 6 地址寄存器 (I2ADDR) ..................................................................................................... 3 数据寄存器 (I2DAT) ........................................................................................................ 3 控制寄存器 (I2CON) ....................................................................................................... 4 状态寄存器 (I2STATUS) ................................................................................................. 4 I2C 波特控制寄存器 (I2CLK) ....................................................................................... 5 I2C时间溢出计数寄存器 (I2TOC).................................................................................... 6

EEPROM..................................................................................................................................... 7 电 ............................................................................................................................................. 7 示代码 ...................................................................................................................................... 8

版本历史 ................................................................................................................................................ 11

AN_1009_SC -1-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

1

简介

本文描述NUC1xx在I2C EEPROM方面的应用

2

I2C 性能
兼容AMBA APB接口 兼容Philips I2C标准,支持主模式 主/从模式最快传输速1M位/秒( 超快模式 ) 主从之间双向数据传输 多主总线(无中央主机) 主机同时发送仲裁可以避免数据总线上的数据损坏 时钟同步允许同比特的设备通过总线通讯 时钟同步作为握手机制可以暂停及恢复传输 内嵌14位时间溢出计时器在I2C总线挂起和时间溢出时产生I2C中断 输出高电平需要上电阻,支持同一总线上的单个设备断电 可编程控制时钟实现多种速控制 支持7位寻址模式 I2C总线控制器支持多地址识别(4个从地址屏蔽选择)

AN_1009_SC -2-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

3

I2C 功能描述

CPU通过如下6个特殊功能寄存器与SIO口相连:I2CON(控制寄存器,C0H),I2STATUS(状态寄存器, BDH), I2DAT (数据寄存器, BCH), I2ADDR (地址寄存器, C1H), I2CLK (时钟控制寄存器,BEH) 以及 I2TOC (时间溢出计时器, BFH) 所有I2C功能寄存器的8-31位都没有定义,这些位没有任何功能并且读到 的值都是。当I2C口通过设置ENS1为高而使能时,内部状态将被I2CON和I2C硬件逻辑控制。当一个 新的状态码被产生并存储到I2STATUS中时,I2C中断标志(SI)自动置位,如果EI2此时为高,I2C中断将 会产生,I2STATUS的高5位保存内部状态码,低3位总是0,这些内容一直保持到软件清除SI位,I2C在 NUC1xx的基地址是0x4002_0000和0x4012_0000

3.1

地址寄存器 (I2ADDR)

I2C口配有4个从地址寄存器,当作为主模式时这些寄存器是没用的,在从模式中,高7位保存MCU的从 地址,I2C将对符合任意一个从地址的内容作出反应 I2C口支持“全呼"功能,如果I2C硬件GC位置位,硬件将响应全呼地址(00H),清除GC位禁止全呼 功能。当GC位置位,I2C在从模式可以接收到总线上主机发出的地址为(00H)的全呼信号。主模式 中,在发出全呼信号到I2C总线前必须先清除AA位 I2C总线控制器配有4个地址屏蔽寄存器支持多地址识别,当地址屏蔽寄存器中某一位设置为1时,接收 到的地址相应位被屏蔽,被设为0时,接收到的地址相应位与地址寄存器中的值是一致的

符号
I2ADDR0 I2ADDR1 I2ADDR2 I2ADDR3 I2ADRM0 I2ADRM1 I2ADRM2 I2ADRM3

定义
I2C 地址0 I2C 地址1 I2C 地址2 I2C 地址3 I2C 地址屏蔽0 I2C 地址屏蔽1 I2C 地址屏蔽2 I2C 地址屏蔽3

地址
I2C_BA+04H I2C_BA+18H I2C_BA+1cH I2C_BA+20H I2C_BA+24H I2C_BA+28H I2C_BA+2CH I2C_BA+30H

MSB Bit 31 Reserved Reserved Reserved Reserved Reserved Reserved Reserved Reserved

BIT ADDRESS, SYMBOL Bit7 ADDR0.6 ~ ADDR0.0 ADDR1.6 ~ ADDR1.0 ADDR2.6 ~ ADDR2.0 ADDR3.6 ~ ADDR3.0 ADRM0.6 ~ ADRM0.0 ADRM1.6 ~ ADRM1.0 ADRM2.6 ~ ADRM2.0 ADRM3.6 ~ ADRM3.0 GC0 GC1 GC2 GC3

LSB Bit0

复位
0000 0000H 0000 0000H 0000 0000H 0000 0000H 0000 000XH 0000 000XH 0000 000XH 0000 000XH

Reserved Reserved Reserved Reserved

3.2

数据寄存器 (I2DAT)

这个寄存器保存8位要发送的数据或刚收到的数据,CPU可以在该寄存器没有移位操作的时候对其直 接读写操作,这种情况发生时SIO在一个特定的状态并且中断标志位(SI)置位,I2DAT中的数据一直 保持到SI位被清。当数据被移出的时候总线上的数据被同时移入,I2DAT总是保存总线上最后一次出 现的数据,就算仲裁失败也可以保证主机发送到从机的数据正确。 I2DAT和应答位组成一个9位移位寄存器,应答位由SIO硬件控制,CPU能读写,数据在SCL时钟 脉冲上升沿移入I2DAT。当1个字节数据被移入I2DAT,应答位(ACK或NACK)在第9个时钟脉冲返 回。数据在SCL时钟脉冲下沿从I2DAT中移出,在上升沿移入I2DAT

I2C Data Register:
I2DAT.7 I2DAT.6 I2DAT.5 I2DAT.4 I2DAT.3 I2DAT.2 I2DAT.1 I2DAT.0 shifting direction

AN_1009_SC -3-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note I2C 数据移位方向

标号
I2DAT

定义
I2C DATA REGISTER

地址
I2C_BA+08H

MSB Bit31

BIT ADDRESS, SYMBOL Bit7 I2DAT.7 ~ I2DAT.0

LSB Bit0

复位
000000xxh

Reserved

3.3

控制寄存器 (I2CON)

CPU可以读写这个8位寄存器,其中2位受硬件影响:SI位在I2C硬件请求中断时置位,STO位在总线 出现STOP条件时被清,当ENS1="0"时STO位也被清 EI ENSI STA STO 使能中断 使能I2C功能模块。当ENSI=1时I2C功能使能,SDA1和SCL1口必须被设为逻辑高 I2C 开始标志,设置STA=1进入主模式,当总线空闲时I2C硬件发送一个START或重复 START条件到总线上 I2C 停止标志,在主模式中设置STO可以发送STOP条件到总线上,I2C硬件将检测总线, 如果一个STOP条件被检测到,STO位被硬件自动清。在从模式中,设置STO可以复位 I2C硬件为“未赋址"从模式,也就是已经在从接收模式,会再接收主发送设备的数据 I2C 中断标志,当新的SIO状态出现在I2STATUS寄存器中,SI标志被硬件置位,如果EA和 EI 2位都被置位,将会产生I2C中断请求。SI位必须被软件写“1"清。 应答产生控制位,当AA=1时,在地址或数据接收之前,应答位(SDA低电平)将在如下两 种情况的应答时钟脉冲周期被返回:1)从机应答主机发送的地址,2)接收设备应答发送设 备的数据。当AA=0时,在地址或数据接收之前,无应答位(SDA高电平)将在SCL线应答 时钟脉冲周期被返回

SI AA

标号

定义

地址

MSB Bit31 Bit7

BIT ADDRESS, SYMBOL Bit6 Bit5 Bit4 Bit3 Bit2

LSB Bit0

复位

I2CON

I2C CONTROL REGISTER I2C_BA+00H

Reserved

EI

ENS1 STA

STO

SI

AA

-

-

0000 0000H

3.4

状态寄存器 (I2STATUS)

I2STATUS是一个8位只读寄存器,低3位总是0,高5位包含状态码,共有26种可能的状态码,当 I2STATUS为F8H时,没有中断产生,所有其他I2STATUS值对应于定义的SIO状态,其中任一个状态进 入后状态中断就会产生(SI=1)。一个有效的状态码将在硬件将SI置位后一个机器周期进入I2STATUS 并一直保持到软件清除SI后一个机器周期。 此外,状态00H表示总线错误,在帧格式的错误位置出现START或STOP条件将产生总线错误。错误位 置如:正在传输一个地址字节,数据字节或者应答位的时候。要想从I2C总线错误中恢复过来,需要 设置STO,清除SI,进入未赋址从模式,然后清除STO释放总线并等待新的通讯,在总线错误发生的过 程中I2C总线无法识别停止条件

AN_1009_SC -4-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

符号

定义

地址

MSB Bit31

BIT ADDRESS, SYMBOL Bit8 Bit7 8 bit status data

LSB Bit0

复位
000000F8H

I2STATUS I2C STATUS REGISTER I2C_BA+0CH

Reserved

3.5

I2C 波特控制寄存器 (I2CLK)

当SIO在主模式时,I2C数据波特取决于I2CLK寄存器,SIO在从模式时自动与主I2C设备时钟同步, 最高到400KHz。 I2C 设 定 数 据 波 特 为 : I2C 数 据 波 特 = PCLK /(4x(I2CLK+1)), 如 果 PCLK=16MHz, I2CLK = 40(28H), 所以 I2C数据波特= 16MHz/(4X (40 +1)) = 97.5K位/秒,如下表所示

符号
I2CLK

定义
I2C CLOCK RATE

地址
I2C_BA+10H

MSB Bit31 Reserved

BIT ADDRESS, SYMBOL Bit8 Bit7 I2CLK.7 ~ I2CLK.0

LSB Bit0

复位
0000 0000H

AN_1009_SC -5-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

3.6

I2C时间溢出计数寄存器 (I2TOC)

一个14位时间溢出计数器可以用来处I2C总线挂起事件,如果时间溢出计数器被使能,计数器即开 始计数直到溢出(TIF=1)并产生I2C中断请求,ENTI清停止计数。当时间溢出计数使能时,设置标 志SI为高复位计数器并在SI清后重新开始计数。如果I2C总线挂起,将导致I2STATUS和SI标志在一段 时间内会被新,14位计数器可能溢出并通过I2C中断通知CPU,请参考下图,用户可以对TIF位写1 清0.

I2C 时间溢出计数器框图

符号
I2TOC

描述

地址

MSB Bit31

BIT ADDRESS, SYMBOL Bit2 ENTI Bit1 DIV4

LSB Bit0 TIF

复位
0000 0000B

I2C TIME-OUT COUNTER REGISTER I2C_BA+14H

Reserved

AN_1009_SC -6-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

4

EEPROM 电
VCC D1 SS24A ICE_CLK ICE_DAT VCC 2 1 CON1 1 3 5 7 9 1 3 5 7 9 HEADER 10X2 10PX2 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 2 4 6 8 10 2 4 6 8 10 ICE_DAT ICE_CLK ICE_RST

I2C EEPROM样片24LC64, 请参考24LC64规格书

5

RB060L

ADAVSS U1 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 ADC4/PA.4 ADC3/PA.3 ADC2/PA.2 ADC1/PA.1 ADC0/PA.0 AVSS VSS VDD ICE_CLK ICE_DAT PWM0/PA.12 PWM1/PA.13 PWM2/PA.14 PWM3/PA.15 SPI1_CS0/PC.8 SPI1_CLK/PC.9 SPI1_DI_0/PC.10 SPI1_DO_0/PC.11 SPI1_DI_1/PC.12 SPI1_DO_1/PC.13 PE.0 PE.1 PE.2 PE.3 PE.4

ICE

VREF AVDD

12M_O 12M_I /RESET VCC

PE.15 PE.14 PE.13 INT1/SPI3_CS1/PB.14 CPO_1/PB.13 CPO_0/PB.12 X32_O X32_I I2C1_SCL/PA.11 I2C1_SDA/PA.10 I2C0_SCL/PA.9 I2C0_SDA/PA.8 SPI3_CS0/PD.8 SPI3_CLK/PD.9 SPI3_DI_0/PD.10 SPI3_DO_0/PD.11 SPI3_DI_1/PD.12 SPI3_DO_1/PD.13 RX1/PB.4 TX1/PB.5 RTS1/PB.6 CTS1/PB.7 LDO_OUT LDO_IN_5V VSS

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

ADC5/PA.5 ADC6/PA.6 ADC7/SPI2_CS1/PA.7 VREF AVDD SPI2_CS0/PD.0 SPI2_CLK/PD.1 SPI2_DI_0/PD.2 SPI2_DO_0/PD.3 SPI2_DI_1/PD.4 SPI2_DO_1/PD.5 CPN0/PC.7 CPP0/PC.6 CPN1/PC.15 CPP1/PC.14 INT0/PB.15 XT_OUT XT_IN RESET# VSS1 VDD1 PS2DAT PS2CLK PVSS TM0/PB.8

NUC140 LQFP 100

TM1/SPI1_CS1/PB.9 TM0/SPI0_CS1/PB.10 TM3/PB.11 PE.5 PE.6 SPI0_SC0 /PC.0 SPI0_CLK /PC.1 SPI0_DI_0 /PC.2 SPI0_DO_0/PC.3 SPI0_DI_1 /PC.4 SPI0_DO_1/PC.5 PD.15 PD.14 CAN0_TX/PD.7 CAN0_RX/PD.6 CTS0/PB.3 RTS0/PB.2 TX0 /PB.1 RX0 /PB.0 USB_D+ USB_DUSB_LDO33_OUT USB_LDO_IN_5V PE.7 PE.8

C1 20p X32O C0603 C2 20p X1 32.768K XTAL-3.4MM-2P R1 10M R0603 X32I C0603

USB_D+ USB_DUSBVBUS C4 20p C0603

C3 20p

R2 33 R3 1M R0603 R0603

12M_O

C0603 C5 20p

X2 12MHz XTAL3-1

12M_I C0603 CRYSTAL

X32O X32I

SCL SDA

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 VCC L1 L0603 ADAVSS C6 20p C0603

USBVBUS VCC VCC USB_DUSB_D+ R4 27 R0603 R5 27 R0603

J1 mini USB 5pin 1 2 3 4 5 VCC DM DP NC GND SHIELD SHIELD SHIELD SHIELD 6 7 8 9 L2

EEPROM ADDRESS:0H
U8 I2C-EEPROM 1 2 3 4 A0 A1 A2 GND 24LC64 VCC WP SCL SDA 8 7 6 5

R46 2.2K

R47 2.2K SW1 PUSH BOTTOM SCL SDA SW R6 10K R0603 /RESET ICE_RST

USB_MINI_B

L0805

C7 10uF/10V TANT-R RESET USB

AN_1009_SC -7-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

6

示代码

#include <stdio.h> #include "NUC1xx.h" #include "Driver\DrvGPIO.h" #include "Driver\DrvI2C.h" #include "Driver\DrvSYS.h" #include "Driver\DrvUART.h"

/*---------------------------------------------------------------------------------------------------------*/ /*MAIN Function*/

/*---------------------------------------------------------------------------------------------------------*/

int main (void) { uint32_t u32HCLK; /* SYSCLK =>12Mhz*/ UNLOCKREG(); SYSCLK->PWRCON.XTL12M_EN = 1; u32HCLK = DrvSYS_GetHCLK() * 1000;

/* Set I2C I/O */ DrvGPIO_InitFunction(FUNC_I2C0);

/* Open I2C0 and set clock = 100Kbps */ DrvI2C_Open(I2C_PORT0, u32HCLK, 100000);

//send i2c start DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0, 0); while (I2C0->CON.SI == 0); //send writer command I2C0->DATA = 0XA0; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); while( I2C0->CON.SI == 0 ); AN_1009_SC -8//send writer command //clr si flag //poll si flag March 11, 2010 Rev. 0.01 //set start //poll si flag

I2C EEPROM 应用指南

Application Note //send address high I2C0->DATA = 0X00; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); while( I2C0->CON.SI == 0 ); //send address low I2C0->DATA = 0X01; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); while( I2C0->CON.SI == 0 ); //send data I2C0->DATA = 0X55; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); while( I2C0->CON.SI == 0 ); //send i2c stop DrvI2C_Ctrl(I2C_PORT0, 0, 1, 1, 0); DrvI2C_Close(I2C_PORT0); //send stop //write data to //clr si and set ack //poll si flag //clr si and set ack //poll si flag //clr si and set ack //poll si flag

/* Open I2C0 and set clock = 100Kbps */ DrvI2C_Open(I2C_PORT0, u32HCLK, 100000); //send i2c start DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0, 0); while (I2C0->CON.SI == 0); //set start //poll si flag

//send writer command I2C0->DATA = 0XA0; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); while( I2C0->CON.SI == 0 ); //clr si //poll si flag

//send address high I2C0->DATA = 0X00; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); while( I2C0->CON.SI == 0 ); //clr si and set ack //poll si flag

//send address low

AN_1009_SC -9-

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note I2C0->DATA = 0X01; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 1); while( I2C0->CON.SI == 0 ); //clr si and set ack //poll si flag

//send start flag DrvI2C_Ctrl(I2C_PORT0, 1, 0, 1, 0); while( I2C0->CON.SI == 0 ); //clr si and send start //poll si flag

//send read command I2C0->DATA = 0XA1; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); while( I2C0->CON.SI == 0 ); //clr si //poll si flag

//resive data I2C0->DATA = 0X00; DrvI2C_Ctrl(I2C_PORT0, 0, 0, 1, 0); while( I2C0->CON.SI == 0 ); //clr si //poll si flag

//send i2c stop DrvI2C_Ctrl(I2C_PORT0, 0, 1, 1, 0); DrvI2C_Close(I2C_PORT0); //clr si and set stpo

while(1); }

AN_1009_SC - 10 -

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

版本历史
REV. 0.01 DATE March 11, 2010 1. Initially issued. DESCRIPTION

AN_1009_SC - 11 -

March 11, 2010 Rev. 0.01

I2C EEPROM 应用指南

Application Note

Important Notice
Nuvoton products are not designed, intended, authorized or warranted for use as components in systems or equipment intended for surgical implantation, atomic energy control instruments, airplane or spaceship instruments, transportation instruments, traffic signal instruments, combustion control instruments, or for other applications intended to support or sustain life. Further more, Nuvoton products are not intended for applications wherein failure of Nuvoton products could result or lead to a situation wherein personal injury, death or severe property or environmental damage could occur. Nuvoton customers using or selling these products for use in such applications do so at their own risk and agree to fully indemnify Nuvoton for any damages resulting from such improper use or sales.

Please note that all data and specifications are subject to change without notice. All the trademarks of products and companies mentioned in this datasheet belong to their respective owners.

AN_1009_SC - 12 -

March 11, 2010 Rev. 0.01


相关文章:
STM32 模拟IIC读写24C02程序代码
STM32 模拟IIC读写24C02程序代码_电子/电路_工程...{ WIN24C02_write(0x00+i,i);delayms(100);}/...(1)//串口 3 发送读取的 EEPROM 的数据 { for(...
51单片机IIC总线操作及24c02指定地址的读写
51 单片机 IIC 总线操作及 24c02 指定地址的读写 (单片机用 STC89C58RD+) ...=1; //到 1s 时标志位置一,开始往 24c02 里写入数据 if(cont==100) ...
STM32 模拟IIC读写24C02程序代码
STM32 模拟IIC读写24C02程序代码_电子/电路_工程...{ WIN24C02_write(0x00+i,i);delayms(100);}/... V1.0 *****/ /*****修改日期 : *****...
IIC-24C04与蜂鸣器-C语言程序
IIC-24C04与蜂鸣器-C语言程序_电子/电路_工程科技_专业资料。IIC-24C04与...0x00; for(i=0;i<14;i++){Write_IIC(i,Song_24C04[i]);} while(1...
24C04模拟IIC读写程序
24C04模拟IIC读写程序_电子/电路_工程科技_专业资料。24C04模拟IIC读写程序...#00h,LOW1 SETB SDA JMP CLIMBER LOW1: CLR SDA ;改 CLIMBER:CALL DELAY ...
ATMEGA16读写iic(TWI)(24c02) C语言程序
ATMEGA16 读写 iic(24c02) C 语言程序 测试通过 #include <iom16v.h> #...1 位停止位,无校验*/ 0x00; 12; /*9600*/ //================...
关于STM32F103RC芯片对EEPROM 芯片AT24C64的IIC通信
#define I2C1_SLAVE_ADDRESS7 #define I2C_Speed 100000 0xA0 // AT24C64 Device address //IIC 速率为 100K 函数中加入了延时等待, 这样做是为了防止程序...
基于S3C2440的IIC程序
(i=0;i<256;i++) Wr24C080(0xa0,(U8)i,i);//写入 0~255 主设备...(1) { rIICDS = slvAddr; _iicStatus = 0x100; rIICSTAT = 0xf0; rIIC...
AVR单片机IIC读写范例IIC.C 或者IIC.H
#define fSCL 100000 //TWI 时钟为 100KHz //预..._24C02 0x00 // AT24C02 的地址线 A2/1/0 ...IIC 器件(例如 AT24C32/64/128/256 等大容量 ...
验证成功的iic verilog 代码
// Revision verilog V1.0 File Created ////...即 100KHz //cnt=1:scl 高电平中间,用于数据采样...iic 所需要的时钟 //需要写入 24C02 的地址和数据...
更多相关标签: