基于MSP430的I2C模拟总线程序讲解.docx
- 文档编号:10879678
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:23
- 大小:20.48KB
基于MSP430的I2C模拟总线程序讲解.docx
《基于MSP430的I2C模拟总线程序讲解.docx》由会员分享,可在线阅读,更多相关《基于MSP430的I2C模拟总线程序讲解.docx(23页珍藏版)》请在冰豆网上搜索。
基于MSP430的I2C模拟总线程序讲解
程序和流程图:
IIC.h
voidInit_IIC(void);
voidEEPROM_ByteWrite(unsignedcharnAddr,unsignedcharnVal);
unsignedcharEEPROM_RandomRead(unsignedcharnAddr);
unsignedcharEEPROM_CurrentAddressRead(void);
voidEEPROM_AckPolling(void);
voidInit_CLK(void);
voidInit_IIC_Port(void);
Main.C
/*******************************************
IICforAT24c16ORAT24C***系列
只要控制好IICRMIICSTPIICSTT其硬件会自动完成
SCLSDA的一系列时序只要注意各个发送与接收的控制标志位.
******************************************/
*include
*include"IIC.h"
volatileunsignedcharData[6];
voidmain(void)
{
//volatileunsignedcharData[6];
//停顿看门狗
WDTCTL=WDTPW+WDTHOLD;
//初始化端口
Init_IIC_Port();
//初始化时钟
Init_CLK();
//I2C初始化
Init_IIC();//置传输方式及控制方式
//翻开中断
_EINT();
//写入数据
EEPROM_ByteWrite(0*0000,0*12);
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0001,0*34);
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0002,0*56);
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0003,0*78);
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0004,0*9A);
//等待写操作完成
EEPROM_AckPolling();
//写入数据
EEPROM_ByteWrite(0*0005,0*BC);
//等待写操作完成
EEPROM_AckPolling();
//读出数据,随机读
Data[0]=EEPROM_RandomRead(0*0000);//地址自动加1
//读出数据,当前地址读
Data[1]=EEPROM_CurrentAddressRead();
//读出数据,当前地址读
Data[2]=EEPROM_CurrentAddressRead();
//读出数据,当前地址读
Data[3]=EEPROM_CurrentAddressRead();
//读出数据,当前地址读
Data[4]=EEPROM_CurrentAddressRead();
//读出数据,当前地址读
Data[5]=EEPROM_CurrentAddressRead();
}
IIC.C
*include
*include"IIC.h"
*defineSLAVEADDR0*50;
intt*_count;
intr*_count;
unsignedcharI2CBuffer[3];
voidInit_IIC(void)
{
//将P3.1和P3.3设置为I2C管脚
P3SEL=0*0A;
//设置P3.1和P3.3管脚的方向
P3DIR&=~0*0A;
//选择为I2C模式
U0CTL|=I2C+SYNC;
//制止I2C模块
U0CTL&=~I2CEN;
//设置I2C为7位地址模式,不使用DMA,
//字节模式,时钟源为SMCLK,
//设置成传输模式
I2CTCTL=I2CTR*+I2CSSEL_2;
//定义从器件地址
I2CSA=SLAVEADDR;
//设置本身的地址
I2COA=0*01A5;
//I2C时钟为SMCLK/160
I2CPSC=159;
//SCL高电平为:
5*I2C时钟
I2CSCLH=0*03;
//SCL低电平为:
5*I2C时钟
I2CSCLL=0*03;
//I2C模块有效
U0CTL|=I2CEN;
t*_count=0;
r*_count=0;
}
voidI2CWriteInit(void)//对于AT24C***的写操作是置成主模式并置位中断使能.
{
//主(Master)模式
U0CTL|=MST;
//传输模式,R/W为:
0
I2CTCTL|=I2CTR*;
//去除中断标志
I2CIFG&=~T*RDYIFG;
//发送中断使能
I2CIE=T*RDYIE;
}
voidI2CReadInit(void)
{
//接收模式,R/W为:
1
I2CTCTL&=~I2CTR*;
//接收中断使能
I2CIE=R*RDYIE;
}
voidEEPROM_ByteWrite(unsignedcharnAddr,unsignedcharnVal)
{
//等待I2C模块完成所有操作//在选定的地址写入数据.
while(I2CDCTL&I2CBUSY);
//设置地址数据
I2CBuffer[1]=nAddr;
//设置数据
I2CBuffer[0]=nVal;
//设置缓冲区指针
t*_count=1;
//写数据初始化
I2CWriteInit();//设置为主模式
//发送数据的长度
//1个控制字节,2个数据字节
I2DAT=2;
//开场和停顿条件产生
//开场I2C通信
I2CTCTL|=I2CSTT+I2CSTP;
return;
}
unsignedcharEEPROM_CurrentAddressRead(void)
{
//等待I2C模块完成所有操作
while(I2CDCTL&I2CBUSY);
//读操作的初始化
I2CReadInit();
//主(Master)模式
U0CTL|=MST;
//接收1个字节的数据
I2DAT=1;
//去除中断标志
I2CIFG&=~ARDYIFG;
//开场接收,产生重新起始和停顿条件
I2CTCTL|=I2CSTT+I2CSTP;
//等待传输完成
while((~I2CIFG)&ARDYIFG);
//返回数据
returnI2CBuffer[0];
}
unsignedcharEEPROM_RandomRead(unsignedcharnAddr)
{
//等待I2C模块完成所有操作
while(I2CDCTL&I2CBUSY);
//设置地址
I2CBuffer[0]=nAddr;
//设置缓冲区指针
t*_count=0;
//写操作初始化
I2CWriteInit();
//传输数据长度
//1个控制字节和一个地址数据
I2DAT=1;
//去除中断标志
I2CIFG&=~ARDYIFG;
//起始条件产生
I2CTCTL|=I2CSTT;
//等待传输完成
while((~I2CIFG)&ARDYIFG);
//读操作初始化
I2CReadInit();
//接收一个字节的数据
I2DAT=1;
//去除中断标志
I2CIFG&=~ARDYIFG;
//开场接收,产生重新起始和停顿条件
I2CTCTL|=I2CSTT+I2CSTP;
//等待传输完成
while((~I2CIFG)&ARDYIFG);
//返回数据
returnI2CBuffer[0];
}
voidEEPROM_AckPolling(void)
{
unsignedintcount;
//等待I2C模块完成所有操作
while(I2CDCTL&I2CBUSY);
count=0;
//去除I2CEN位
U0CTL&=~I2CEN;
I2CTCTL|=I2CRM;
//使能I2C模块
U0CTL|=I2CEN;
//设置NACKIFG标志
I2CIFG=NACKIFG;
while(NACKIFG&I2CIFG)
{
//去除中断标志
I2CIFG=0*00;
//主(Master)模式
U0CTL|=MST;
//设置传输模式
I2CTCTL|=I2CTR*;
//产生起始条件
I2CTCTL|=I2CSTT;
//等待I2CSTT被去除
while(I2CTCTL&I2CSTT);
//产生停顿条件
I2CTCTL|=I2CSTP;
//等待停顿条件复位
while(I2CDCTL&I2CBUSY);
count=count+1;
}
//去除I2CEN位
U0CTL&=~I2CEN;
I2CTCTL&=~I2CRM;
//使能I2C
U0CTL|=I2CEN;
return;
}
*if__VER__<200
interrupt[USART0T*_VECTOR]voidISR_I2C(void)
*else
*pragmavector=USART0T*_VECTOR
__interruptvoidISR_I2C(void)
*endif//上面的程序其实只要编写:
//*pragmavector=USART0T*_VECTOR__interruptvoidISR_I2C(void)就行.
{
switch(I2CIV)
{
caseI2CIV_AL:
{
//仲裁中断
break;
}
caseI2CIV_NACK:
{
//NACK中断
break;
}
caseI2CIV_OA:
{
//自己地址中断
break;
}
caseI2CIV_ARDY:
{
//访问准备好中断
break;
}
caseI2CIV_R*RDY:
{
//接收准备好中断
I2CBuffer[0]=I2CDRB;
break;
}
caseI2CIV_T*RDY:
{
//发送准备好中断
I2CDRB=I2CBuffer[t*_count];
t*_count=t*_count-1;
if(t*_count<0)
{
//制止发送中断
I2CIE&=~T*RDYIE;
}
break;
}
caseI2CIV_GC:
{
//一般调用中断
break;
}
caseI2CIV_STT:
{
//起始条件中断
break;
}
}
}
voidInit_IIC_Port(void)
{
//初始化端口存放器与IIC口无关的P*口关闭以便于对编写系统板的综合程序.
//P1DIR=0*FF;
//P2DIR=0*FF;
P3DIR=0*F5;
//P4DIR=0*FF;
P5DIR=0*7F;
//P6DIR=0*FF;
//P4OUT=0*11;
//P5OUT&=0*F0;
P3SEL|=BIT1+BIT3;//在这里如果设置成
}
voidInit_CLK(void)
{
unsignedinti;
//将存放器的容清零
//*T2震荡器开启
//LFT*1工作在低频模式
//ACLK的分频因子为1
BCSCTL1=0*00;
do
{//去除OSCFault标志
IFG1&=~OFIFG;
for(i=0*20;i>0;i--);
}
while((IFG1&OFIFG)==OFIFG);//如果OSCFault=1
//open*T2,LFT*2选择低频率
BCSCTL1&=~(*T2OFF+*TS);//BCSCTL1=0*00功能一样
//DCORsel=7(Freq=3200k/25摄氏度〕
BCSCTL1|=RSEL0+RSEL1+RSEL2;
BCSCTL1|=0*07;
//MCLK的时钟源为T*2CLK,分频因子为1
BCSCTL2+=SELM1;
//SMCLK的时钟源为T*2CLK,分频因子为1
BCSCTL2+=SELS;
}
//对于系统时钟的选择关系到整个程序运行稳定性.
/************************************************************
*文件名:
msp430f169i2c.c
*整体描述:
MSP430F169单片机硬件IIC软件,字节方式,主方式
* IIC接口:
P3.3=SCL,P3.1=SDA;(开漏输出)
* 相应存放器:
地址存放器I2COA用于存放自身从地址(从方式时才有用)
* 地址存放器I2CSA用于存放外围的从机地址(主方式时才有用)
* 控制存放器U0CTL硬件I2C的设置、使能、模式等。
发送控制存放器I2CTCTL
* 数据控制存放器I2CDCTL指示I2C总线的状态
*
* U0CTL--R*DMAEN,T*DMAEN,I2C,*A,LISREN,SYNC,MST,I2CEN
* 0 0 1 0 0 1 1 1 (0*17)
* I2CTCTL--I2CWORD,I2CRM,I2CSSEL1,I2*SSEL0,I2CTR*,I2CSTB,I2CSTP,I2CSTT
* 0 1 1 0 * 0 * *
* jy
*状态:
通过
************************************************************/
*include
*include"fpgacode.h"
*defineWR24C512
*defineLED1_1 (0*20) /*Port3.5Output->LED1 */
*defineLED1_0 (0*df)
*defineSDA_1 P3OUT|= BIT1 //串行数据线,SDA=1
*defineSDA_0 P3OUT&=~BIT1 //SDA=0
*defineSCL_1 P3OUT|= BIT3 //串行时钟线,SCL=1
*defineSCL_0 P3OUT&=~BIT3 //SCL=0
*defineSDADIR_IN P3DIR&=~BIT1 //SDA,I/O口为输入
*defineSDADIR_OUT P3DIR|= BIT1 //I/0口为输出
*defineSDA_IN ((P3IN>>1)&0*01) //ReadSDA
*defineSCLDIR_IN P3DIR&=~BIT3 //SCL,I/O口为输入
*defineSCLDIR_OUT P3DIR|= BIT3 //I/0口为输出
*defineSCL_IN ((P3IN>>3)&0*01) //ReadSCL
*ifdefWR24C512
staticintnumi=0; //DataPointer
*else
staticintnumj=0; //DataPointer
*endif
*defineI2CSLA0*50
/*--------------------------------------------------------
--功能描述:
检查总线是否空闲
--子程序状况:
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
}
/*---------------------------------------------------------
--功能描述:
发送数据:
用于向总线发送数据
--子程序状况:
09-23调试通过
-----------------------------------------------------------
--*/
voidI2cBusSendByte(unsignedcharc)
{
while((I2CIFG&T*RDYIFG)!
=T*RDYIFG); //检测发送准备
I2CDRB=c; //写发送存放器
}
/*------------------MSP430I2C写数据09-23调试通过---------------------*/
/*--------------------------------------------------------
--功能描述:
申请总线:
进展I2C总线的初始化-发送起始信号
--子程序状况:
09-23调试通过
----------------------------------------------------------
--*/
voidI2C_Send(unsignedcharndatNum)
{
//注意:
通讯完毕,I2CMST自动清零,再次通讯必须重新置位
P3OUT=0*00; //clearP3outputregister
P3SEL=0*0A; //P3.1=SDA,P3.3=SCL,SelectI2Cpins,SetupI2Cmodule
U0CTL|=(I2C+SYNC); //selectI2Cmode;*A=0,7bit_addresing;
U0CTL&=~I2CEN; //i2c功能使能无效
//I2CTCTL=I2CRM+I2CSSEL_2; //*(*>256)字节模式,newstart测试使用
// 选择方式I2CRM=0,最终用户使用
I2CTCTL= I2CSSEL_2;
I2DAT=2+ndatNum; //最终用户使用,2byte地址+128byte数据
I2CPSC=2; //setscl
I2CIFG=0;
I2CSA=0*50; //SlaveaddressofAt24c512
U0CTL|=I2CEN; //enableI2Cmodule,7bitaddr, mastermode 08-26
U0CTL|=MST;
while(I2CBUSY&I2CDCTL); //I2Cready"在空闲状态:
0,空闲;1:
忙
I2CTCTL|=I2CTR*+I2CSTT+I2CSTP; //I2CRM=0,启动总线,发送从器件地址
while((I2CIFG&NACKIFG)==0*02); // ack为低电平,等待地址应答位,判断 无应答NACKIFG=1
}
/*----------------------------------------------------------------
--子程标号 :
I2cWrSlaSu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MSP430 I2C 模拟 总线 程序 讲解