msp430硬件II2C
扫描二维码
随时随地手机看文章
说明:24lc128为美信公司EEPROM存储器,存取空间为128kbit。具体的通信规则可以看其器件手册。
/*******************************************************************************
包含头文件
*******************************************************************************/
#include <msp430x54x.h>
/*******************************************************************************
全局变量的定义
*******************************************************************************/
unsigned char RXData;
unsigned char count;
/*******************************************************************************
函数定义
*******************************************************************************/
void IIC_init(void); // 初始化设置
void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word);
// 字节写设置
void EEPROM_radom(unsigned char high_Address,unsigned char low_Address);
// 随机读设置
void EEPROM_read(); // 连续读设置
/*************************************************************************
** 函数名称:
** 工作环境:
** 作者:
** 生成日期:
** 功能:STOP信号和START信号之间延时 5MS
** 相关文件:
** 修改日志:
*************************************************************************/
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)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
for(unsigned char i=0;i<0xff;i++);
IIC_init(); // 初始化IIC
EEPROM_Write(0x01,0x00,0x10); // 字节写
Delay(); // 延时
EEPROM_radom(0x01,0x00); // 随机读
EEPROM_read(); // 立即读
LPM0;
}
/*************************************************************************
** 函数名称:
** 工作环境:
** 作者:
** 生成日期:
** 功能:初始化I2C接口
传输方式设置,主从设置,波特率设置
** 相关文件:
** 修改日志:
*************************************************************************/
void IIC_init(void)
{
P10SEL |= BIT1 + BIT2;
P10REN |= BIT1 + BIT2;
UCB3CTL1 |= UCSWRST; // 置位UCSWRST
UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主机, 同步 模式
UCB3CTL1 |= UCSSEL_2; // SMCLK
UCB3BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB3BR1 = 0;
UCB3I2CSA = 0x50; // 从机地址0x50
UCB3CTL1 &= ~UCSWRST; // 清除UCSWRST
UCB3IE |= UCRXIE; // 使能接收中断
_EINT();
}
/*************************************************************************
** 函数名称:
** 工作环境:
** 作者:
** 生成日期:
** 功能:向相关的存储单元写入数据
** 相关文件:
** 修改日志:
*************************************************************************/
void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)
{
while (UCB3CTL1 & UCTXSTP); // 确定总线空闲
UCB3CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为发送模式
UCB3TXBUF = high_Address; // 发送高位地址
while((UCB3IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB3TXBUF = low_Address; // 发送低位地址
while((UCB3IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB3TXBUF = Word; // 发送数据
while((UCB3IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB3CTL1 |= UCTXSTP; // 发送停止位
while((UCB3CTL1 & UCTXSTP)==1); // 判断停止位是否发送完毕
}
/*************************************************************************
** 函数名称:字节读函数
** 工作环境:
** 作者:
** 生成日期:
** 功能: 连续读发送设置
** 相关文件:
** 修改日志:
*************************************************************************/
void EEPROM_read()
{
UCB3CTL1 &= ~UCTR; // 确定为读
while (UCB3CTL1 & UCTXSTP); // 总线是否空闲
UCB3CTL1 |= UCTXSTT; // 发送开始位
}
/*************************************************************************
** 函数名称:字节写函数
** 工作环境:
** 作者:
** 生成日期:
** 功能: 随机读发送设置
** 相关文件:
** 修改日志:
*************************************************************************/
void EEPROM_radom(unsigned char high_Address,unsigned char low_Address)
{
while (UCB3CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB3CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为写
UCB3TXBUF = high_Address; // 发送地址位高位
while((UCB3IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB3TXBUF = low_Address; // 发送地址位低位
while((UCB3IFG & UCTXIFG)==0); // 判断是否发送完毕
UCB3CTL1 &= ~UCTR; // 确定为接收
while (UCB3CTL1 & UCTXSTP); // 判断总线是否被释放
UCB3CTL1 |=UCTXSTT; // 重新发送起始位
while((UCB3CTL1 & UCTXSTT)==1); // 判断起始位是否发送成功
for(unsigned char i=0x0;i<0x2f;i++); // 延时确定数据已经被发送出去
UCB3CTL1 |=UCTXSTP + UCTXNACK; // 发送停止位和NACK位
}
/*********