I2C程序和流程图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序和流程图:
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 "IIC.h"
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 "IIC.h"
#define SLA VEADDR 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)