📄 csi24wc02.c
字号:
/****************************************************************************
* File:CSI24WC02.C
* 功能:使用LPC210x模拟EEPROM器件CSI24WC02。LPC210x具有硬件I2C接口,使用其从方式进行
* I2C器件模拟,本例使用了256字节的RAM作为存储单元。
* 说明:将跳线器JP12断开,然后与主机连接。
****************************************************************************/
#include "config.h"
#define CSI24WC02 0xA1 /* 定义从要地址,忽略通用地址 */
uint8 eeprom[256]; /* 定义EEPROM存储单元,256字节 */
uint8 adrpoint; /* 定义EEPROM读写操作指针 */
uint8 slarv; /* 定义子地址接收标志,为1时表示己接收从机地址 */
/****************************************************************************
* 名称:IRQ_I2C()
* 功能:I2C中断服务函数,实规从机操作。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_I2C(void)
{ uint8 sta;
sta = I2STAT; // 取得I2C状态字
sta &= 0xF8;
switch(sta)
{ case 0x60: // 接收到自身SLA+W
case 0x68:
slarv = 0;
I2CONSET = 0x04;
break;
case 0xA8: // 接收到SLA+R,或已发送数据并接收到ACK位。
case 0xB0:
case 0xB8:
I2DAT = eeprom[adrpoint];
adrpoint++;
I2CONSET = 0x04;
break;
case 0x80: // 接收到数据
if(0==slarv)
{ adrpoint = I2DAT;
slarv = 1;
}
else
{ eeprom[adrpoint] = I2DAT;
adrpoint++;
}
I2CONSET = 0x04;
break;
case 0xA0: // 已发送数据,并接收到非ACK
case 0xC0: // 总线结束,或总线重新启动
default: // 其它状态
I2CONSET = 0x04;
}
I2CONCLR = 0x38; // 清除标I2C标志位,STA、STO、SI
VICVectAddr = 0x00;
}
/****************************************************************************
* 名称:main()
* 功能:初始化I2C口连接,并初始化向量中断控制器。
****************************************************************************/
int main(void)
{ adrpoint = 0;
slarv = 0;
PINSEL0 = 0x00000050; // 设置I2C口连接
PINSEL1 = 0x00000000; // P0.16设置为EINT0
I2ADR = CSI24WC02; // 设置从机地址
I2CONSET = 0x44; // I2C配置为从机模式
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x29; // I2C通道分配到IRQ slot 0
VICVectAddr0 = (int)IRQ_I2C; // 设置I2C中断向量地址
VICIntEnable = 0x00000200; // 使能I2C中断
while(1); // 等待中断
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -