說(shuō)明:24lc128為美信公司EEPROM存儲(chǔ)器,存取空間為128kbit。具體的通信規(guī)則可以看其器件手冊(cè)。
/*******************************************************************************
包含頭文件
*******************************************************************************/
#include <msp430x54x.h>
/*******************************************************************************
全局變量的定義
*******************************************************************************/
unsigned char RXData;
unsigned char count;
/*******************************************************************************
函數(shù)定義
*******************************************************************************/
void IIC_init(void); // 初始化設(shè)置
void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word);
// 字節(jié)寫(xiě)設(shè)置
void EEPROM_radom(unsigned char high_Address,unsigned char low_Address);
// 隨機(jī)讀設(shè)置
void EEPROM_read(); // 連續(xù)讀設(shè)置
/*************************************************************************
** 函數(shù)名稱(chēng):
** 工作環(huán)境:
** 作者:
** 生成日期:
** 功能:STOP信號(hào)和START信號(hào)之間延時(shí) 5MS
** 相關(guān)文件:
** 修改日志:
*************************************************************************/
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++);
}
/*************************************************************************
** 函數(shù)名稱(chēng):
** 工作環(huán)境:
** 作者:
** 生成日期:
** 相關(guān)文件:
** 修改日志:
*************************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門(mén)狗
for(unsigned char i=0;i<0xff;i++);
IIC_init(); // 初始化IIC
EEPROM_Write(0x01,0x00,0x10); // 字節(jié)寫(xiě)
Delay(); // 延時(shí)
EEPROM_radom(0x01,0x00); // 隨機(jī)讀
EEPROM_read(); // 立即讀
LPM0;
}
/*************************************************************************
** 函數(shù)名稱(chēng):
** 工作環(huán)境:
** 作者:
** 生成日期:
** 功能:初始化I2C接口
傳輸方式設(shè)置,主從設(shè)置,波特率設(shè)置
** 相關(guān)文件:
** 修改日志:
*************************************************************************/
void IIC_init(void)
{
P10SEL |= BIT1 + BIT2;
P10REN |= BIT1 + BIT2;
UCB3CTL1 |= UCSWRST; // 置位UCSWRST
UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主機(jī), 同步 模式
UCB3CTL1 |= UCSSEL_2; // SMCLK
UCB3BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB3BR1 = 0;
UCB3I2CSA = 0x50; // 從機(jī)地址0x50
UCB3CTL1 &= ~UCSWRST; // 清除UCSWRST
UCB3IE |= UCRXIE; // 使能接收中斷
_EINT();
}
/*************************************************************************
** 函數(shù)名稱(chēng):
** 工作環(huán)境:
** 作者:
** 生成日期:
** 功能:向相關(guān)的存儲(chǔ)單元寫(xiě)入數(shù)據(jù)
** 相關(guān)文件:
** 修改日志:
*************************************************************************/
void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)
{
while (UCB3CTL1 & UCTXSTP); // 確定總線(xiàn)空閑
UCB3CTL1 |= UCTXSTT + UCTR; // 發(fā)送起始位,確定為發(fā)送模式
UCB3TXBUF = high_Address; // 發(fā)送高位地址
while((UCB3IFG & UCTXIFG)==0); // 判斷是否發(fā)送完畢
UCB3TXBUF = low_Address; // 發(fā)送低位地址
while((UCB3IFG & UCTXIFG)==0); // 判斷是否發(fā)送完畢
UCB3TXBUF = Word; // 發(fā)送數(shù)據(jù)
while((UCB3IFG & UCTXIFG)==0); // 判斷是否發(fā)送完畢
UCB3CTL1 |= UCTXSTP; // 發(fā)送停止位
while((UCB3CTL1 & UCTXSTP)==1); // 判斷停止位是否發(fā)送完畢
}
/*************************************************************************
** 函數(shù)名稱(chēng):字節(jié)讀函數(shù)
** 工作環(huán)境:
** 作者:
** 生成日期:
** 功能: 連續(xù)讀發(fā)送設(shè)置
** 相關(guān)文件:
** 修改日志:
*************************************************************************/
void EEPROM_read()
{
UCB3CTL1 &= ~UCTR; // 確定為讀
while (UCB3CTL1 & UCTXSTP); // 總線(xiàn)是否空閑
UCB3CTL1 |= UCTXSTT; // 發(fā)送開(kāi)始位
}
/*************************************************************************
** 函數(shù)名稱(chēng):字節(jié)寫(xiě)函數(shù)
** 工作環(huán)境:
** 作者:
** 生成日期:
** 功能: 隨機(jī)讀發(fā)送設(shè)置
** 相關(guān)文件:
** 修改日志:
*************************************************************************/
void EEPROM_radom(unsigned char high_Address,unsigned char low_Address)
{
while (UCB3CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB3CTL1 |= UCTXSTT + UCTR; // 發(fā)送起始位,確定為寫(xiě)
UCB3TXBUF = high_Address; // 發(fā)送地址位高位
while((UCB3IFG & UCTXIFG)==0); // 判斷是否發(fā)送完畢
UCB3TXBUF = low_Address; // 發(fā)送地址位低位
while((UCB3IFG & UCTXIFG)==0); // 判斷是否發(fā)送完畢
UCB3CTL1 &= ~UCTR; // 確定為接收
while (UCB3CTL1 & UCTXSTP); // 判斷總線(xiàn)是否被釋放
UCB3CTL1 |=UCTXSTT; // 重新發(fā)送起始位
while((UCB3CTL1 & UCTXSTT)==1); // 判斷起始位是否發(fā)送成功
for(unsigned char i=0x0;i<0x2f;i++); // 延時(shí)確定數(shù)據(jù)已經(jīng)被發(fā)送出去
UCB3CTL1 |=UCTXSTP + UCTXNACK; // 發(fā)送停止位和NACK位
}
/*********