基于MSP430的I2C模拟总线程序讲解Word下载.docx
《基于MSP430的I2C模拟总线程序讲解Word下载.docx》由会员分享,可在线阅读,更多相关《基于MSP430的I2C模拟总线程序讲解Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
![基于MSP430的I2C模拟总线程序讲解Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/28/bc99b636-7bde-4d0f-9f9c-fb22c43ec4cb/bc99b636-7bde-4d0f-9f9c-fb22c43ec4cb1.gif)
EEPROM_ByteWrite(0x0002,0x56);
EEPROM_ByteWrite(0x0003,0x78);
EEPROM_ByteWrite(0x0004,0x9A);
EEPROM_ByteWrite(0x0005,0xBC);
//读出数据,随机读
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
#defineSLAVEADDR0x50;
inttx_count;
intrx_count;
unsignedcharI2CBuffer[3];
voidInit_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低电平为:
I2CSCLL=0x03;
//I2C模块有效
U0CTL|=I2CEN;
tx_count=0;
rx_count=0;
voidI2CWriteInit(void)//对于AT24CXXX的写操作是置成主模式并置位中断使能.
//主(Master)模式
U0CTL|=MST;
//传输模式,R/W为:
I2CTCTL|=I2CTRX;
//清除中断标志
I2CIFG&
=~TXRDYIFG;
//发送中断使能
I2CIE=TXRDYIE;
voidI2CReadInit(void)
//接收模式,R/W为:
1
I2CTCTL&
=~I2CTRX;
//接收中断使能
I2CIE=RXRDYIE;
voidEEPROM_ByteWrite(unsignedcharnAddr,unsignedcharnVal)
//等待I2C模块完成所有操作//在选定的地址写入数据.
while(I2CDCTL&
I2CBUSY);
//设置地址数据
I2CBuffer[1]=nAddr;
//设置数据
I2CBuffer[0]=nVal;
//设置缓冲区指针
tx_count=1;
//写数据初始化
I2CWriteInit();
//设置为主模式
//发送数据的长度
//1个控制字节,2个数据字节
I2CNDAT=2;
//开始和停止条件产生
//开始I2C通信
I2CTCTL|=I2CSTT+I2CSTP;
return;
unsignedcharEEPROM_CurrentAddressRead(void)
//等待I2C模块完成所有操作
I2CBUSY);
//读操作的初始化
I2CReadInit();
//接收1个字节的数据
I2CNDAT=1;
=~ARDYIFG;
//开始接收,产生重新起始和停止条件
I2CTCTL|=I2CSTT+I2CSTP;
//等待传输完成
while((~I2CIFG)&
ARDYIFG);
//返回数据
returnI2CBuffer[0];
unsignedcharEEPROM_RandomRead(unsignedcharnAddr)
//设置地址
I2CBuffer[0]=nAddr;
//写操作初始化
//传输数据长度
//1个控制字节和一个地址数据
//起始条件产生
I2CTCTL|=I2CSTT;
ARDYIFG);
//读操作初始化
//接收一个字节的数据
voidEEPROM_AckPolling(void)
{
unsignedintcount;
count=0;
//清除I2CEN位
I2CTCTL|=I2CRM;
//使能I2C模块
//设置NACKIFG标志
I2CIFG=NACKIFG;
while(NACKIFG&
I2CIFG)
{
I2CIFG=0x00;
//设置传输模式
//产生起始条件
//等待I2CSTT被清除
while(I2CTCTL&
I2CSTT);
//产生停止条件
I2CTCTL|=I2CSTP;
//等待停止条件复位
while(I2CDCTL&
I2CBUSY);
count=count+1;
}
=~I2CRM;
//使能I2C
#if__VER__<
200
interrupt[USART0TX_VECTOR]voidISR_I2C(void)
#else
#pragmavector=USART0TX_VECTOR
__interruptvoidISR_I2C(void)
#endif//上面的程序其实只要编写:
//#pragmavector=USART0TX_VECTOR__interruptvoidISR_I2C(void)就行.
switch(I2CIV)
{
caseI2CIV_AL:
//仲裁中断
break;
caseI2CIV_NACK:
//NACK中断
caseI2CIV_OA:
//自己地址中断
caseI2CIV_ARDY:
//访问准备好中断
caseI2CIV_RXRDY:
//接收准备好中断
I2CBuffer[0]=I2CDRB;
caseI2CIV_TXRDY:
//发送准备好中断
I2CDRB=I2CBuffer[tx_count];
tx_count=tx_count-1;
if(tx_count<
0)
//禁止发送中断
I2CIE&
=~TXRDYIE;
}
caseI2CIV_GC:
//一般调用中断
caseI2CIV_STT:
//起始条件中断
voidInit_IIC_Port(void)
//初始化端口寄存器与IIC口无关的PX口关闭以便于对编写系统板的综合程序.
//P1DIR=0xFF;
//P2DIR=0xFF;
P3DIR=0xF5;
//P4DIR=0xFF;
P5DIR=0x7F;
//P6DIR=0xFF;
//P4OUT=0X11;
//P5OUT&
=0XF0;
P3SEL|=BIT1+BIT3;
//在这里如果设置成
voidInit_CLK(void)
unsignedinti;
//将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
BCSCTL1=0X00;
do
{//清除OSCFault标志
IFG1&
=~OFIFG;
for(i=0x20;
i>
0;
i--);
while((IFG1&
OFIFG)==OFIFG);
//如果OSCFault=1
//openXT2,LFTX2选择低频率
BCSCTL1&
=~(XT2OFF+XTS);
//BCSCTL1=0X00功能一样
//DCORsel=7(Freq=3200k/25摄氏度)
BCSCTL1|=RSEL0+RSEL1+RSEL2;
BCSCTL1|=0x07;
//MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2+=SELM1;
//SMCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2+=SELS;
//对于系统时钟的选择关系到整个程序运行稳定性.
/************************************************************
*文件名:
msp430f169i2c.c
*整体描述:
MSP430F169单片机硬件IIC软件,字节方式,主方式
*
IIC接口:
P3.3=SCL,P3.1=SDA;
(开漏输出)
相应寄存器:
地址寄存器I2COA用于存放自身从地址(从方式时才有用)
地址寄存器I2CSA用于存放外围的从机地址(主方式时才有用)
控制寄存器U0CTL硬件I2C的设置、使能、模式等。
发送控制寄存器I2CTCTL
数据控制寄存器I2CDCTL指示I2C总线的状态
*
U0CTL--RXDMAEN,TXDMAEN,I2C,XA,LISREN,SYNC,MST,I2CEN
0
0
1
1
(0x17)
I2CTCTL--I2CWORD,I2CRM,I2CSSEL1,I2XSSEL0,I2CTRX,I2CSTB,I2CSTP,I2CSTT
*
*作者:
jy
*状态:
通过
************************************************************/
msp430x16x.h>
fpgacode.h"
#defineWR24C512
#defineLED1_1
(0x20)
/*Port3.5Output->
LED1
*/
#defineLED1_0
(0xdf)
#defineSDA_1
P3OUT|=
BIT1
//串行数据线,SDA=1
#defineSDA_0
P3OUT&
=~BIT1
//SDA=0
#defineSCL_1
BIT3
//串行时钟线,SCL=1
#defineSCL_0
=~BIT3
//SCL=0
#defineSDADIR_IN
P3DIR&
//SDA,I/O口为输入
#defineSDADIR_OUT
P3DIR|=
//I/0口为输出
#defineSDA_IN
((P3IN>
>
1)&
0x01)
//ReadSDA
#defineSCLDIR_IN
//SCL,I/O口为输入
#defineSCLDIR_OUT
#defineSCL_IN
3)&
//ReadSCL
#ifdefWR24C512
staticintnumi=0;
//DataPointer
staticintnumj=0;
#endif
#defineI2CSLA0x50
/*--------------------------------------------------------
--功能描述:
检查总线是否空闲
--子程序状况:
09-23调试通过
----------------------------------------------------------
--*/
voidI2c_Idle_Check(void)
while(I2CBUSY&
I2CDCTL);
//I2Cready?
在空闲状态:
0,空闲;
1:
忙
voidDelayTime10us(unsignedcharn)
unsignedchari;
while(n--)
//5cycles
for(i=0;
i<
10;
i++);
//8mhz
110:
771+4towhile
/*---------------------------------------------------------
--功能描述:
发送数据:
用于向总线发送数据
-----------------------------------------------------------
voidI2cBusSendByte(unsignedcharc)
{
while((I2CIFG&
TXRDYIFG)!
=TXRDYIFG);
//检测发送准备
I2CDRB=c;
//写发送寄存器
/*------------------MSP430I2C写数据09-23调试通过---------------------*/
申请总线:
进行I2C总线的初始化-发送起始信号
voidI2C_Send(unsignedcharndatNum)
//注意:
通讯结束,I2CMST自动清零,再次通讯必须重新置位
P3OUT=0x00;
//clearP3outputregister
//P3.1=SDA,P3.3=SCL,SelectI2Cpins,SetupI2Cmodule
U0CTL|=(I2C+SYNC);
//selectI2Cmode;
XA=0,7bit_addresing;
//i2c功能使能无效
//I2CTCTL=I2CRM+I2CSSEL_2;
//x(x>
256)字节模式,newstart测试使用
//
选择方式I2CRM=0,最终用户使用
I2CTCTL=
I2CSSEL_2;
I2CNDAT=2+ndatNum;
//最终用户使用,2byte地址+128byte数据
I2CPSC=2;
//setscl
I2CIFG=0;
I2CSA=0x50;
//SlaveaddressofAt24c512
//enableI2Cmodule,7bitaddr,
mastermode
08-26
//I2Cready?
I2CTCTL|=I2CTRX+I2CSTT+I2CSTP;
//I2CRM=0,启动总线,发送从器件地址
NACKIFG)==0x02);
//
ack为低电平,等待地址应答位,判断
无应答NACKIFG=1
/*----------------------------------------------