基于MSP430的I2C模拟总线程序讲解_第1页
基于MSP430的I2C模拟总线程序讲解_第2页
基于MSP430的I2C模拟总线程序讲解_第3页
基于MSP430的I2C模拟总线程序讲解_第4页
基于MSP430的I2C模拟总线程序讲解_第5页
已阅读5页,还剩29页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序和流程图IIC.hvoid Init_IIC(void);void EEPROM_ByteWrite(unsigned char nAddr,unsigned char nVal);unsigned char EEPROM_RandomRead(unsigned char nAddr);unsigned char EEPROM_CurrentAddressRead(void);void EEPROM_AckPolling(void);void Init_CLK(void);void Init_IIC_Port(void);Main.C1m*IIC for AT24c16OR AT24CXX

2、X 系歹 U只要限制好IICRM IICSTP IICSTT 其硬件会自动完成SCL SDA的一系列时序只要注意各个发送与接收的限制标志位*/#include <MSP430x16x.h>#include "IIC.h"volatile unsigned char Data6;void main(void)/volatile unsigned char Data6;/停止看门狗WDTCTL = WDTPW+WDTHOLD;初始化端口Init_IIC_Port();/初始化时钟Init_CLK();/I2C初始化Init_IIC();/置传输方式及限制方式翻开中断

3、_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);/等待写操

4、作完成EEPROM_AckPolling();/写入数据EEPROM_ByteWrite(0x0005,0xBC);/等待写操作完成EEPROM_AckPolling();读生数据,随机读Data0 = EEPROM_RandomRead(0x0000); / 地址自动力口 1读生数据,当前地址读Data1 = EEPROM_CurrentAddressRead();读生数据,当前地址读Data2 = EEPROM_CurrentAddressRead();读生数据,当前地址读Data3 = EEPROM_CurrentAddressRead();读生数据,当前地址读Data4 = EEPRO

5、M_CurrentAddressRead();读生数据,当前地址读Data5 = EEPROM_CurrentAddressRead();)IIC.C#include <MSP430x16x.h>#include "IIC.h"#define SLAVEADDR 0x50;int tx_count;int rx_count;unsigned char I2CBuffer3;void Init_IIC(void)/将P3.1和P3.3设置为I2C管脚P3SEL = 0x0A;设置P3.1和P3.3管脚的方向P3DIR &= 0x0A;选择为I2C模式U0C

6、TL |= I2C + SYNC;/禁止I2C模块U0CTL &=I2CEN;/设置I2C为7位地址模式,不使用 DMA ,字节模式,时钟源为 SMCLK,/设置成传输模式I2CTCTL = I2CTRX + I2CSSEL_2;/定义从器件地址I2CSA = SLAVEADDR;/设置本身的地址I2COA = 0X01A5;/I2C 时钟为 SMCLK / 160I2CPSC = 159;/SCL 高电平为:5 *I2C 时钟I2CSCLH = 0x03;/SCL低电平为:5 *I2C时钟I2CSCLL = 0x03;/I2C模块有效U0CTL |= I2CEN;tx_count =

7、 0;rx_count = 0;void I2CWriteInit(void)对于AT24CXXX的写操作是置成主模式并置位中断使能.主(Master)模式U0CTL |= MST;传输模式,R/W 为:0I2CTCTL |= I2CTRX;/去除中断标志I2CIFG &=TXRDYIFG;/发送中断使能I2CIE = TXRDYIE;)void I2CReadInit(void)(接收模式,R/W 为:1I2CTCTL &= I2CTRX;/接收中断使能I2CIE = RXRDYIE;)void EEPROM_ByteWrite(unsigned char nAddr, un

8、signed char nVal)(/等待I2C模块完成所有操作在选定的地址写入数据while (I2CDCTL&I2CBUSY);/设置地址数据I2CBuffer1 = nAddr;/设置数据I2CBuffer0 = nVal;/设置缓冲区指针tx_count = 1;/写数据初始化I2CWriteInit();/设置为主模式/发送数据的长度/1个限制字节,2个数据字节I2CNDAT = 2;/开始和停止条件产生/开始I2C通信I2CTCTL |= I2CSTT+I2CSTP;return;)unsigned char EEPROM_CurrentAddressRead(void)

9、(/等待I2C模块完成所有操作while (I2CDCTL&I2CBUSY);/读操作的初始化I2CReadInit();主(Master)模式U0CTL |= MST;/接收1个字节的数据I2CNDAT = 1;/去除中断标志I2CIFG &=ARDYIFG;开始接收,产生重新起始和停止条件I2CTCTL |= I2CSTT + I2CSTP;/等待传输完成while (I2CIFG)&ARDYIFG);/返回数据return I2CBuffer0;)unsigned char EEPROM_RandomRead(unsigned char nAddr) (/等待I2

10、C模块完成所有操作while (I2CDCTL&I2CBUSY);/设置地址I2CBuffer0 = nAddr;/设置缓冲区指针tx_count = 0;/写操作初始化I2CWriteInit();/传输数据长度/1个限制字节和一个地址数据I2CNDAT = 1;/去除中断标志I2CIFG &=ARDYIFG;/起始条件产生I2CTCTL |= I2CSTT;/等待传输完成while (I2CIFG)&ARDYIFG);/读操作初始化I2CReadInit();/接收一个字节的数据I2CNDAT = 1;/去除中断标志I2CIFG &= ARDYIFG;开始接

11、收,产生重新起始和停止条件I2CTCTL |= I2CSTT + I2CSTP;/等待传输完成while (I2CIFG)&ARDYIFG);/返回数据return I2CBuffer0;void EEPROM_AckPolling(void)unsigned int count;/等待I2C模块完成所有操作while (I2CDCTL&I2CBUSY);count=0;/去除I2CEN位U0CTL &= I2CEN;I2CTCTL |= I2CRM;/使能I2C模块U0CTL |= I2CEN;/设置NACKIFG标志I2CIFG = NACKIFG;while (N

12、ACKIFG & 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;/使能I2CU0CTL |=

13、I2CEN;return;)#if VER < 200interrupt USART0TX_VECTOR void ISR_I2C(void)#else#pragma vector=USART0TX_VECTOR_interrupt void ISR_I2C(void)#endif/上面的程序其实只要编写:/#pragma vector=USART0TX_VECTOR_interruptvoid ISR_I2C(void)就行.switch (I2CIV)case I2CIV_AL:仲裁中断break;)case I2CIV_NACK:/NACK中断 break;case I2CIVOA

14、: /自己地址中断break;case I2CIV_ARDY:/访问准备好中断break;case I2CIV_RXRDY:/接收准备好中断I2CBuffer0=I2CDRB;break;case I2CIV_TXRDY:/发送准备好中断I2CDRB = I2CBuffertx_count;tx_count = tx_count - 1;if tx_count < 0/禁止发送中断I2CIE &=TXRDYIE;) break;)case I2CIV_GC:(一般调用中断 break;)case I2CIV_STT:(/起始条件中断 break;)void Init_IIC_Po

15、rt(void)(与IIC 口无关的PX 关闭以便于对编写系统初始化端口存放器板的综合程序/P1DIR = 0xFF;/P2DIR = 0xFF;P3DIR = 0xF5;/P4DIR = 0xFF;P5DIR = 0x7F;/P6DIR = 0xFF;/P4OUT = 0X11;/P5OUT &= 0XF0;P3SEL|=BIT1+BIT3;/在这里如果设置成)void Init_CLK(void)unsigned int i;/将存放器的容清零/XT2震荡器开启/LFTX1工作在低频模式/ACLK的分频因子为1BCSCTL1 = 0X00;do/去除OSCFault标志IFG1 &

16、amp;=OFIFG;for (i = 0x20; i > 0; i-);)while (IFG1 & OFIFG) = OFIFG); / 如果 OSCFault =1/open XT2, LFTX2选择低频率BCSCTL1 &= (XT2OFF + XTS); /BCSCTL1=0X00功能一样/DCO Rsel=7(Freq=3200k/25 摄氏度)BCSCTL1 |= RSEL0 + RSEL1 + RSEL2;BCSCTL1 |= 0x07;/MCLK的时钟源为TX2CLK,分频因子为 1BCSCTL2 += SELM1;/SMCLK的时钟源为TX2CLK,分

17、频因子为 1BCSCTL2 += SELS;)/对于系统时钟的选择关系到整个程序运行稳定性/* 文件名:msp430f169i2c.c* 整体描述:MSP430F169单片机硬件IIC软件,字节方式,主方式* IIC 接口: P3.3=SCL,P3.1=SDA;开漏输由* 相应存放器:地址存放器I2COA用于存放自身从地址从方 式时才有用地址存放器I2CSA用于存放外围的限制存放器U0CTL硬件I2C的设发送限制存放器I2CTCTL数据限制存放器I2CDCTL指示I2C*从机地址主方式时才有用*置、使能、模式等.*总线的状态U0CTL - RXDMAEN,TXDMAEN,I2C, XA,jy*

18、状态:通过LISREN,SYNC,MST,I2CEN(0x17)I2CTCTL -I2CWORD,I2CRM,I2CSSEL1,I2XSSEL0,I2CTRX,I2CSTB, I2CSTP, I2CSTT*作者:*/ #include <msp430x16x.h> #include "fpgacode.h"#define WR24C512#define LED11(0x20)/* Port 3.5 Output ->(0xdf)LED1 */ #define LED10/串#define SDA_1串行数据线,SDA = 1#define SDA_0BIT

19、1#define SCL_1行时钟线,SCL = 1P3OUT |= BIT1P3OUT &=/SDA = 0P3OUT |= BIT3#define SCL_0=0#define SDADIR_IN口为输入#define SDADIR_OUT 输由#define SDA_IN#define SCLDIR_IN输入#define SCLDIR_OUT 出#define SCL_IN#ifdef WR24C512static int numi = 0;#elsestatic int numj = 0;#endif#define I2CSLA 0x50P3OUT &= BIT3P3

20、DIR &= BIT1P3DIR |= BIT1(P3IN >> 1) & 0x01)P3DIR &= BIT3P3DIR |= BIT3/SCL/SDA,I/O/I/0 口 为/Read SDA/SCL,I/O 口为/I/0 口为输/Read SCL/Data Pointer/Data Pointer(P3IN >> 3) & 0x01)/*-功能描述:检查总线是否空闲-子程序状况:09-23调试通过-*/void I2c_Idle_Check(void)(while (I2CBUSY & I2CDCTL);/ I2C read

21、y?在空闲状态:0,空闲;1 :忙void DelayTime10us(unsigned char n)(unsigned char i;while(n-)/ 5 cyclesfor(i=0;i<10;i+);/ 8mhz 110:771 + 4 towhile/*-功能描述:发送数据:用于向总线发送数据-子程序状况:09-23调试通过-*/ void I2cBusSendByte(unsigned char c)while(I2CIFG & TXRDYIFG) != TXRDYIFG);I2CDRB = c;写发送存放器/检测发送准备/*MSP430 I2C写数据 09-23调

22、试通过*/*-功能描述:申请总线:进行I2C总线的初始化发送起始信号-子程序状况:09-23调试通过-*/void I2C_Send(unsigned char ndatNum) (清零,再次通讯必须重新置位P3OUT = 0x00;registerP3SEL = 0x0A;/注意:通讯结束,I2CMST自动/ clear P3 output/ P3.1=SDA,P3.3=SCL,Select I2C pins, Setup I2C moduleU0CTL |= (I2C + SYNC);mode;XA=0,7bit_addresing;U0CTL &= I2CEN;/ select

23、I2C/ i2c功能使能无效/ I2CTCTL = I2CRM + I2CSSEL_2;/ x(x>256)字节模式,new start最终用户使用,2byte地/ set scl/ Slave address of/ enable I2C module, 7/ I2C ready?/ I2CRM =0,启动总线,发/ ack为低电平,测试使用/选择方式I2CRM=0 ,最终用户使用I2CTCTL = I2CSSEL_2;I2CNDAT = 2 + ndatNum;/址+ 128byte 数据I2CPSC = 2;I2CIFG = 0;I2CSA = 0x50;At24c512U0CTL

24、 |= I2CEN; bit addr, master mode 08-26U0CTL |= MST;while (I2CBUSY & I2CDCTL);在空闲状态:0,空闲;1:忙I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ;送从器件地址while(I2CIFG & NACKIFG) = 0x02);等待地址应答位,判断无应答NACKIFG = 1)/*- -子程标号:I2cWrSlaSubAddr- -子程功能:主机发送从机的子地址- -入口参数:unsigned char sla,unsigned intsuba- -参数说明:子地址- -子程

25、序状况:09-23调试通过- -说明:完成地址信息的定位,先确定顺序读写的起始地址-*/unsigned char I2cSendSubAddr(unsigned int suba,unsigned char ndatNum) /启动总线,等待地unsigned char Hi_suba,Lo_suba;I2C_Send(ndatNum);址应答位Hi_suba = ( unsigned char )( suba >> 8 );Lo_suba = ( unsigned char )( suba & 0x00ff );I2cBusSendByte( Hi_suba );whi

26、le(I2CIFG & 0x02) = NACKIFG )I2CTCTL |= I2CSTP;答,结束总线return(0);I2cBusSendByte( Lo_suba );址while(I2CIFG & 0x02 )=0x02 )/I2CTCTL |= I2CSTP;答,结束总线return(0);return(1);/发送器件子地址/等待数据的应答/无应/发送器件子地等待数据的应答/无应/*- -子程标号:I2cWriteStr(用户函数-子程功能:向I2C从器件写入数据- - 入口参数:unsigned char *ps,unsigned charnum- -参数说明

27、:写入数据的地址指针,数据个数- -子程序状况:09-23调试通过- -说明:I2C读取数据- -*/unsigned char I2cSendStr(const unsigned char * ps,unsigned char num) (/ unsigned char i;unsigned char tempnum;tempnum = num-1;for(numi=0;numi<tempnum;numi+)(/等待数据的I2cBusSendByte(*ps);while(I2CIFG & 0x02) = NACKIFG)应答(I2CTCTL |= I2CSTP;/无应答,结束

28、总线return(0);)ps+;)/ I2CTCTL |= I2CSTP; /I2CRM =1 模式中,在发送最后一个数据之前将停止位置位,*特别注意,必须I2cBusSendByte(*ps);while(I2CIFG & 0x02) = NACKIFG) / 等待数据的应答(I2CTCTL |= I2CSTP; /无应答,结束总线return(0);)return(1);)/ 写 at24c512-void I2cWrAt24c512(void)(unsigned int j=0;unsigned char m,n;unsigned int tempAddr;/ page wri

29、te/ I2Cfor (j = 0;j <462;j+) ( tempAddr = 128*j;while (I2CBUSY & I2CDCTL);ready?I2cSendSubAddr(tempAddr,0x80);I2cSendStr(FPGACfg+tempAddr,0x80);P4OUT A= 0x80;for (m=0;m<125;m+) for (n=0;n<110;n+);P4OUT a= 0x80;tempAddr = 128*j;while (I2CBUSY & I2CDCTL);/ I2C ready?I2cSendSubAddr(tem

30、pAddr,0x4f);I2cSendStr(FPGACfg+tempAddr,0x4f);P4OUT a= 0x80;for (m=0;m<125;m+) for (n=0;n<110;n+);P4OUT a= 0x80;/*MSP430 I2C读取数据*/*- -子程标号:I2cSlaSubAddr- -子程功能:主器件发送从机器件地址和子地址- -入口参数:unsigned intsuba- -参数说明:子地址- -子程调用:I2cBusSendByte- -子程序状况:Y- -说明:完成地址信息的定位,先确定顺序读写的起始地址-*/void I2cReceSubAddr(u

31、nsigned int suba)址unsigned char Hi_suba,Lo_suba;P3OUT = 0x00;registerP3SEL = 0x0A;P3.3=SCL,Select I2C pins, Setup I2C moduleU0CTL |= I2C + SYNC;mode;XA=0,7bit_addresing;U0CTL &=I2CEN;/ I2CTCTL = I2CRM + I2CSSEL_2;字节个数I2CTCTL = I2CSSEL_2;I2CNDAT = 2;址+ 128byte数据,固定字节I2CIFG = 0;I2CPSC = 1;/ I2CSCL

32、H = 0x02;/ I2CSCLL = 0x02;I2CSA = 0x50;/ test 09-25读之前先写地/ clear P3 output/ P3.1=SDA,/ select I2C/ i2c功能使能无效/ I2CRM = 1,自己设定/ I2CRM = 0,/ I2CRM = 0,2byte 地/ set scl/ High period of SCL/ Low period of SCL/ Slave address ofAt24c512U0CTL |= I2CEN;/ enable I2C module, 7bit addr,master mode08-26U0CTL |=

33、MST;Hi_suba = ( unsigned char )( suba >> 8 );Lo_suba = ( unsigned char )( suba & 0x00ff );while (I2CBUSY & I2CDCTL);/ I2C ready? 在空闲状态:0,空闲;1 :忙I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ;/ I2CRM =0,启动总线,发送从器件地址while(I2CIFG & NACKIFG) = 0x02)/ ack 为低电平,等待地址应答位,判断 无应答NACKIFG = 1I2CTCTL |=

34、I2CSTP; / 结束总线I2cBusSendByte( Hi_suba );/ 发送器件子地址while(I2CIFG & NACKIFG) = 0x02)/ ack 为低电平,等待地址应答位,判断 无应答NACKIFG = 1I2CTCTL |= I2CSTP; / 结束总线I2cBusSendByte( Lo_suba );/ 发送器件子地址while(I2CIFG & NACKIFG) = 0x02)/ ack 为低电平,等待地址应答位,判断 无应答NACKIFG = 1I2CTCTL |= I2CSTP; / 结束总线DelayTime10us(250);DelayTime10us(250);DelayTime10us(250);DelayTime10us(250);/*- -子程标号:I2cSlaSubAddr- -子程功能:主器件接收初始化- -入口参数:无-子程序状-说明-*/void InitI2cRece(unsigned char num)(P3OUT = 0x00;register

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论