/*******************************************************************************
** 项目名称:I2C通信
** 作者:刘志成
*******************************************************************************/
#include <msp430f5529.h>
/*******************************************************************************
全局变量的定义
*******************************************************************************/
unsigned char RXData;
unsigned char count;
/*******************************************************************************
函数定义
*******************************************************************************/
void I2C_init(void); // 初始化设置
void I2C_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word);
// 字节写设置
void I2C_radom(unsigned char high_Address,unsigned char low_Address);
// 随机读设置
void I2C_read(); // 连续读设置
void Delay()
{
for(unsigned char i=0;i<0xff;i++);
for(unsigned char i=0;i<0xff;i++);
for(unsigned char i=0;i<0xff;i++);
for(unsigned char i=0;i<0xff;i++);
for(unsigned char i=0;i<0xff;i++);
}
void main(void)
{
unsigned char i=0;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
for(i=0; i<0xff; i++)
;
IIC_init(0x50); // 初始化IIC
I2C_Write(0x00,0x69,0x10);
Delay(); // 延时
I2C_Read();
LPM0;
}
/*************************************************************************
** 函数名称:初始化函数
** 功能:初始化I2C接口
传输方式设置,主从设置,波特率设置
** 相关文件:
** 修改日志:
*************************************************************************/
void IIC_init(int addr)
{
P3SEL |= BIT1 + BIT0; // P3.0、3.1初始化
P3REN |= BIT1 + BIT0; // 要进行输入务必进行上拉
UCB0CTL1 |= UCSWRST; // 置位UCSWRST
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主机, 同步 模式
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 40; // fSCL = SMCLK/40 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = addr; // 从机地址0x50
UCB0CTL1 &= ~UCSWRST; // 清除UCSWRST
UCB0IE |= UCRXIE; // 使能接收中断
_EINT();
}
/*************************************************************************
** 函数名称:I2C读取
** 功能: 随机读发送设置
** 相关文件:
** 修改日志:
*************************************************************************/
void I2C_Read(unsigned char high_Address,unsigned char low_Address)
{
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为写
UCB0TXBUF = high_Address; // 发送地址位高位
while((UCB0IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB0TXBUF = low_Address; // 发送地址位低位
while((UCB0IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB0CTL1 &= ~UCTR; // 确定为接收
while (UCB0CTL1 & UCTXSTP); // 判断总线是否被释放
UCB0CTL1 |=UCTXSTT; // 重新发送起始位
while((UCB0CTL1 & UCTXSTT)==1); // 判断起始位是否发送成功
for(unsigned char i=0x0;i<0x2f;i++); // 延时确定数据已经被发送出去
// UCB0CTL1 |=UCTXSTP + UCTXNACK; // 发送停止位和NACK位
}
/*************************************************************************
** 函数名称:I2C写函数
** 功能:向相关的存储单元写入数据
** 相关文件:
** 修改日志:
*************************************************************************/
void I2C_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)
{
while (UCB0CTL1 & UCTXSTP); // 确定总线空闲
UCB0CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为发送模式
UCB0TXBUF = high_Address; // 发送高位地址
while((UCB0IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB0TXBUF = low_Address; // 发送低位地址
while((UCB0IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB0TXBUF = Word; // 发送数据
while((UCB0IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB0CTL1 |= UCTXSTP; // 发送停止位
while((UCB0CTL1 & UCTXSTP)==1); // 判断停止位是否发送完毕
}
/*************************************************************************
** 函数名称:接收中断函数0
** 功能: 存取接收的数据
** 相关文件:
** 修改日志:
*************************************************************************/
#pragma vector = USCI_B0_VECTOR
__interrupt void USCIAB0_ISR(void)
{
if(UCB0IFG & UCRXIFG) // 接收中断
{
count++;
RXData = UCB0RXBUF;
}
}