当前位置:文档之家› 基于MSP430的I2C模拟总线程序讲解

基于MSP430的I2C模拟总线程序讲解

基于MSP430的I2C模拟总线程序讲解
基于MSP430的I2C模拟总线程序讲解

程序和流程图:

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 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个数据字节

相关主题
文本预览
相关文档 最新文档