基于的模拟总线程序讲解.docx

上传人:b****6 文档编号:12711107 上传时间:2023-06-07 格式:DOCX 页数:26 大小:20.12KB
下载 相关 举报
基于的模拟总线程序讲解.docx_第1页
第1页 / 共26页
基于的模拟总线程序讲解.docx_第2页
第2页 / 共26页
基于的模拟总线程序讲解.docx_第3页
第3页 / 共26页
基于的模拟总线程序讲解.docx_第4页
第4页 / 共26页
基于的模拟总线程序讲解.docx_第5页
第5页 / 共26页
基于的模拟总线程序讲解.docx_第6页
第6页 / 共26页
基于的模拟总线程序讲解.docx_第7页
第7页 / 共26页
基于的模拟总线程序讲解.docx_第8页
第8页 / 共26页
基于的模拟总线程序讲解.docx_第9页
第9页 / 共26页
基于的模拟总线程序讲解.docx_第10页
第10页 / 共26页
基于的模拟总线程序讲解.docx_第11页
第11页 / 共26页
基于的模拟总线程序讲解.docx_第12页
第12页 / 共26页
基于的模拟总线程序讲解.docx_第13页
第13页 / 共26页
基于的模拟总线程序讲解.docx_第14页
第14页 / 共26页
基于的模拟总线程序讲解.docx_第15页
第15页 / 共26页
基于的模拟总线程序讲解.docx_第16页
第16页 / 共26页
基于的模拟总线程序讲解.docx_第17页
第17页 / 共26页
基于的模拟总线程序讲解.docx_第18页
第18页 / 共26页
基于的模拟总线程序讲解.docx_第19页
第19页 / 共26页
基于的模拟总线程序讲解.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于的模拟总线程序讲解.docx

《基于的模拟总线程序讲解.docx》由会员分享,可在线阅读,更多相关《基于的模拟总线程序讲解.docx(26页珍藏版)》请在冰点文库上搜索。

基于的模拟总线程序讲解.docx

基于的模拟总线程序讲解

程序和流程图:

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

/*******************************************

IICforAT24c16ORAT24CXXX系列

只要控制好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(0x0000,0x12);

//等待写操作完成

EEPROM_AckPolling();

//写入数据

EEPROM_ByteWrite(0x0001,0x34);

//等待写操作完成

EEPROM_AckPolling();

//写入数据

EEPROM_ByteWrite(0x0002,0x56);

//等待写操作完成

EEPROM_AckPolling();

//写入数据

EEPROM_ByteWrite(0x0003,0x78);

//等待写操作完成

EEPROM_AckPolling();

//写入数据

EEPROM_ByteWrite(0x0004,0x9A);

//等待写操作完成

EEPROM_AckPolling();

//写入数据

EEPROM_ByteWrite(0x0005,0xBC);

//等待写操作完成

EEPROM_AckPolling();

//读出数据,随机读

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

#include

#include"IIC.h"

#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低电平为:

5*I2C时钟

I2CSCLL=0x03;

//I2C模块有效

U0CTL|=I2CEN;

tx_count=0;

rx_count=0;

}

voidI2CWriteInit(void)//对于AT24CXXX的写操作是置成主模式并置位中断使能.

{

//主(Master)模式

U0CTL|=MST;

//传输模式,R/W为:

0

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模块完成所有操作

while(I2CDCTL&I2CBUSY);

//读操作的初始化

I2CReadInit();

//主(Master)模式

U0CTL|=MST;

//接收1个字节的数据

I2CNDAT=1;

//清除中断标志

I2CIFG&=~ARDYIFG;

//开始接收,产生重新起始和停止条件

I2CTCTL|=I2CSTT+I2CSTP;

//等待传输完成

while((~I2CIFG)&ARDYIFG);

//返回数据

returnI2CBuffer[0];

}

unsignedcharEEPROM_RandomRead(unsignedcharnAddr)

{

//等待I2C模块完成所有操作

while(I2CDCTL&I2CBUSY);

//设置地址

I2CBuffer[0]=nAddr;

//设置缓冲区指针

tx_count=0;

//写操作初始化

I2CWriteInit();

//传输数据长度

//1个控制字节和一个地址数据

I2CNDAT=1;

//清除中断标志

I2CIFG&=~ARDYIFG;

//起始条件产生

I2CTCTL|=I2CSTT;

//等待传输完成

while((~I2CIFG)&ARDYIFG);

//读操作初始化

I2CReadInit();

//接收一个字节的数据

I2CNDAT=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=0x00;

//主(Master)模式

U0CTL|=MST;

//设置传输模式

I2CTCTL|=I2CTRX;

//产生起始条件

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[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中断

break;

}

caseI2CIV_OA:

{

//自己地址中断

break;

}

caseI2CIV_ARDY:

{

//访问准备好中断

break;

}

caseI2CIV_RXRDY:

{

//接收准备好中断

I2CBuffer[0]=I2CDRB;

break;

}

caseI2CIV_TXRDY:

{

//发送准备好中断

I2CDRB=I2CBuffer[tx_count];

tx_count=tx_count-1;

if(tx_count<0)

{

//禁止发送中断

I2CIE&=~TXRDYIE;

}

break;

}

caseI2CIV_GC:

{

//一般调用中断

break;

}

caseI2CIV_STT:

{

//起始条件中断

break;

}

}

}

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

*00100111(0x17)

*I2CTCTL--I2CWORD,I2CRM,I2CSSEL1,I2XSSEL0,I2CTRX,I2CSTB,I2CSTP,I2CSTT

*0110*0**

*作者:

jy

*状态:

通过

************************************************************/

#include

#include"fpgacode.h"

#defineWR24C512

#defineLED1_1(0x20)/*Port3.5Output->LED1*/

#defineLED1_0(0xdf)

#defineSDA_1P3OUT|=BIT1//串行数据线,SDA=1

#defineSDA_0P3OUT&=~BIT1//SDA=0

#defineSCL_1P3OUT|=BIT3//串行时钟线,SCL=1

#defineSCL_0P3OUT&=~BIT3//SCL=0

#defineSDADIR_INP3DIR&=~BIT1//SDA,I/O口为输入

#defineSDADIR_OUTP3DIR|=BIT1//I/0口为输出

#defineSDA_IN((P3IN>>1)&0x01)//ReadSDA

#defineSCLDIR_INP3DIR&=~BIT3//SCL,I/O口为输入

#defineSCLDIR_OUTP3DIR|=BIT3//I/0口为输出

#defineSCL_IN((P3IN>>3)&0x01)//ReadSCL

#ifdefWR24C512

staticintnumi=0;//DataPointer

#else

staticintnumj=0;//DataPointer

#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++);//8mhz110:

771+4towhile

}

/*---------------------------------------------------------

--功能描述:

发送数据:

用于向总线发送数据

--子程序状况:

09-23调试通过

-----------------------------------------------------------

--*/

voidI2cBusSendByte(unsignedcharc)

{

while((I2CIFG&TXRDYIFG)!

=TXRDYIFG);//检测发送准备

I2CDRB=c;//写发送寄存器

}

/*------------------MSP430I2C写数据09-23调试通过---------------------*/

/*--------------------------------------------------------

--功能描述:

申请总线:

进行I2C总线的初始化-发送起始信号

--子程序状况:

09-23调试通过

----------------------------------------------------------

--*/

voidI2C_Send(unsignedcharndatNum)

{

//注意:

通讯结束,I2CMST自动清零,再次通讯必须重新置位

P3OUT=0x00;//clearP3outputregister

P3SEL=0x0A;//P3.1=SDA,P3.3=SCL,SelectI2Cpins,SetupI2Cmodule

U0CTL|=(I2C+SYNC);//selectI2Cmode;XA=0,7bit_addresing;

U0CTL&=~I2CEN;//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

U0CTL|=I2CEN;//enableI2Cmodule,7bitaddr,mastermode08-26

U0CTL|=MST;

while(I2CBUSY&I2CDCTL);//I2Cready在空闲状态:

0,空闲;1:

I2CTCTL|=I2CTRX+I2CSTT+I2CSTP;//I2CRM=0,启动总线,发送从器件地址

while((I2CIFG&NACKIFG)==0x02);//ack为低电平,等待地址应答位,判断无应答NACKIFG=1

}

/*----------------------------------------------------------------

--子程标号:

I2cWrSlaSubAddr

--子程功能:

主机发送从机的子地址

--入口参数:

unsignedcharsla,unsignedintsuba

--参数说明:

子地址

--子程序状况:

09-23调试通过

--说明:

完成地址信息的定位,先确定顺序读写的起始地址

-----------------------------------------------------------------

--*/

unsignedcharI2cSendSubAddr(unsignedintsuba,unsignedcharndatNum)

{

unsignedcharHi_suba,Lo_suba;

I2C_Send(ndatNum);//启动总线,等待地址应答位

Hi_suba=(unsignedchar)(suba>>8);

Lo_suba=(unsignedchar)(suba&0x00ff);

I2cBusSendByte(Hi_suba);//发送器件子地址

while((I2CIFG&0x02)==NACKIFG)//等待数据的应答

{

I2CTCTL|=I2CSTP;//无应答,结束总线

return(0);

}

I2cBusSendByte(Lo_suba);//发送器件子地址

while((I2CIFG&0x02)==0x02)//等待数据的应答

{

I2CTCTL|=I2CSTP;//无应答,结束总线

return(0);

}

return

(1);

}

/*------------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2