|
msp430系列硬件I2C操作24LC128程序
[复制链接]
说明:24lc128为美信公司EEPROM存储器,存取空间为128kbit。具体的通信规则可以看其器件手册。
***************************************************************************************/
运行代码 复制代码-
- /*******************************************************************************
- 包含头文件
- *******************************************************************************/
- #include
- /*******************************************************************************
- 全局变量的定义
- *******************************************************************************/
- 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位
- }
-
- /*************************************************************************
- ** 函数名称:接收中断函数
- ** 工作环境:
- ** 作者:
- ** 生成日期:
- ** 功能: 存取接收的数据
- ** 相关文件:
- ** 修改日志:
- *************************************************************************/
- #pragma vector = USCI_B3_VECTOR
- __interrupt void USCIAB3_ISR(void)
- {
- if(UCB3IFG & UCRXIFG) // 接收中断
- {
- count++;
- RXData = UCB3RXBUF;
- }
- }
分享:
程序在开始调试的时候,一直都调不通。数据总是只能发送一次,程序复位后,数据就发不出去了,找了好长时间都找不出来。最后找来示波器,发现数据发送一次后,没有发送停止位,程序停止后,SCL依然为低电平,没有变为高。(复位也不可以)可是将SCL断开后在插上,发现SCL就变成高电平,就可以在发送数据了。当程序发送了停止位后,这种情况就没有了,复位后就可以重新发送数据了。
在对器件进行字节写后,立马进行读操作时,一定要加上足够长的延时,所以在程序中会有5ms的长延时。如果写停止后,立即进行读操作,可能读不到数据。不通的芯片,加的延时可能不通,但延时最好能足够长。
呵呵,一点小小的心得。希望对大家有点用。有错误的地方,希望可以一起交流。
|
|