教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 建筑文档 >

I2C程序和流程图

来源:网络收集 时间:2026-04-26
导读: 程序和流程图: IIC.h void Init_IIC(void); void EEPROM_ByteWrite(unsigned char nAddr,unsigned char nVal); unsigned char EEPROM_RandomRead(unsigned char nAddr); unsigned char EEPROM_CurrentAddressRead(void); void EEPROM_AckPolling(void); void

程序和流程图: IIC.h

void Init_IIC(void);

void EEPROM_ByteWrite(unsigned char nAddr,unsigned char nVal); unsigned char EEPROM_RandomRead(unsigned char nAddr); unsigned char EEPROM_CurrentAddressRead(void); void EEPROM_AckPolling(void); void Init_CLK(void); void Init_IIC_Port(void); Main.C

/*******************************************

IIC for AT24c16 OR AT24CXXX 系列

只要控制好IICRM IICSTP IICSTT 其硬件会自动完成

SCL SDA的一系列时序 只要注意各个发送与接收的控制标志位. ******************************************/ #include #include \

volatile unsigned char Data[6]; void main(void) {

//volatile unsigned char Data[6];

//停止看门狗

WDTCTL = WDTPW+WDTHOLD; //初始化端口 Init_IIC_Port();

//初始化时钟 Init_CLK(); //I2C初始化

Init_IIC(); //置传输方式及控制方式

//打开中断 _EINT();

//写入数据

EEPROM_ByteWrite(0x0000,0x12); //等待写操作完成

EEPROM_AckPolling(); //写入数据

EEPROM_ByteWrite(0x0001,0x34); //等待写操作完成

EEPROM_AckPolling(); //写入数据

EEPROM_ByteWrite(0x0002,0x56); //等待写操作完成

EEPROM_AckPolling(); //写入数据

EEPROM_ByteWrite(0x0003,0x78); //等待写操作完成

EEPROM_AckPolling(); //写入数据

EEPROM_ByteWrite(0x0004,0x9A); //等待写操作完成

EEPROM_AckPolling(); //写入数据

EEPROM_ByteWrite(0x0005,0xBC); //等待写操作完成

EEPROM_AckPolling();

//读出数据,随机读

Data[0] = EEPROM_RandomRead(0x0000); //地址自动加1 //读出数据,当前地址读

Data[1] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读

Data[2] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读

Data[3] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读

Data[4] = EEPROM_CurrentAddressRead(); //读出数据,当前地址读

Data[5] = EEPROM_CurrentAddressRead(); }

IIC.C

#include #include \

#define SLAVEADDR 0x50; int tx_count; int rx_count;

unsigned char I2CBuffer[3]; void Init_IIC(void) {

//将P3.1和P3.3设置为I2C管脚 P3SEL = 0x0A;

//设置P3.1和P3.3管脚的方向 P3DIR &= ~0x0A; //选择为I2C模式

U0CTL |= I2C + SYNC; //禁止I2C模块

U0CTL &= ~I2CEN;

//设置I2C为7位地址模式,不使用DMA, //字节模式,时钟源为SMCLK, //设置成传输模式

I2CTCTL = I2CTRX + I2CSSEL_2; //定义从器件地址

I2CSA = SLAVEADDR; //设置本身的地址

I2COA = 0x01A5;

//I2C时钟为SMCLK / 160 I2CPSC = 159;

//SCL 高电平为:5 *I2C 时钟 I2CSCLH = 0x03;

//SCL 低电平为:5 *I2C 时钟 I2CSCLL = 0x03; //I2C 模块有效 U0CTL |= I2CEN; tx_count = 0; rx_count = 0; }

void I2CWriteInit(void) //对于AT24CXXX的写操作是置成主模式并置位中断使能. {

//主(Master)模式 U0CTL |= MST;

//传输模式,R/W 为:0 I2CTCTL |= I2CTRX; //清除中断标志

I2CIFG &= ~TXRDYIFG; //发送中断使能

I2CIE = TXRDYIE; }

void I2CReadInit(void) {

//接收模式,R/W 为:1 I2CTCTL &= ~I2CTRX; //接收中断使能

I2CIE = RXRDYIE; }

void EEPROM_ByteWrite(unsigned char nAddr, unsigned char nVal) {

//等待I2C模块完成所有操作 //在选定的地址写入数据. while (I2CDCTL&I2CBUSY) ; //设置地址数据

I2CBuffer[1] = nAddr; //设置数据

I2CBuffer[0] = nVal; //设置缓冲区指针 tx_count = 1; //写数据初始化

I2CWriteInit(); //设置为主模式 //发送数据的长度

//1个控制字节,2个数据字节

I2CNDAT = 2; //开始和停止条件产生 //开始I2C通信

I2CTCTL |= I2CSTT+I2CSTP; return; }

unsigned char EEPROM_CurrentAddressRead(void)

{

//等待I2C模块完成所有操作 while (I2CDCTL&I2CBUSY); //读操作的初始化 I2CReadInit(); //主(Master)模式 U0CTL |= MST;

//接收1个字节的数据 I2CNDAT = 1; //清除中断标志

I2CIFG &= ~ARDYIFG;

//开始接收,产生重新起始和停止条件 I2CTCTL |= I2CSTT + I2CSTP; //等待传输完成

while ((~I2CIFG)&ARDYIFG) ; //返回数据

return I2CBuffer[0]; }

unsigned char EEPROM_RandomRead(unsigned char nAddr) {

//等待I2C模块完成所有操作 while (I2CDCTL&I2CBUSY); //设置地址

I2CBuffer[0] = nAddr; //设置缓冲区指针 tx_count = 0; //写操作初始化 I2CWriteInit(); //传输数据长度

//1个控制字节和一个地址数据 I2CNDAT = 1; //清除中断标志

I2CIFG &= ~ARDYIFG; //起始条件产生

I2CTCTL |= I2CSTT; //等待传输完成

while ((~I2CIFG)&ARDYIFG); //读操作初始化 I2CReadInit();

//接收一个字节的数据 I2CNDAT = 1; //清除中断标志

I2CIFG &= ~ARDYIFG;

//开始接收,产生重新起始和停止条件 I2CTCTL |= I2CSTT + I2CSTP; //等待传输完成

while ((~I2CIFG)&ARDYIFG); //返回数据

return I2CBuffer[0]; }

void EEPROM_AckPolling(void) {

unsigned int count;

//等待I2C模块完成所有操作 while (I2CDCTL&I2CBUSY);

count=0;

//清除I2CEN位

U0CTL &= ~I2CEN; I2CTCTL |= I2CRM; //使能I2C模块 U0CTL |= I2CEN; //设置NACKIFG标志 I2CIFG = NACKIFG;

while (NACKIFG & I2CIFG) {

//清除中断标志 I2CIFG=0x00; //主(Master)模式 U0CTL |= MST; //设置传输模式

I2CTCTL |= I2CTRX; //产生起始条件

…… 此处隐藏:2121字,全部文档内容请下载后查看。喜欢就下载吧 ……

I2C程序和流程图.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/439077.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)