ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:20.12KB ,
资源ID:12711107      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-12711107.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于的模拟总线程序讲解.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

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.C/* IIC for AT24c

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

3、(); /写入数据 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(0x000

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

5、ad(); /读出数据,当前地址读 Data4 = EEPROM_CurrentAddressRead(); /读出数据,当前地址读 Data5 = EEPROM_CurrentAddressRead(); IIC.C#include #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

6、模式 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

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

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

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

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

11、); /接收一个字节的数据 I2CNDAT = 1; /清除中断标志 I2CIFG &= ARDYIFG; /开始接收,产生重新起始和停止条件 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; /

12、使能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

13、 + 1; /清除I2CEN位 U0CTL &= I2CEN; I2CTCTL &= I2CRM; /使能I2C U0CTL |= I2CEN; return;#if _VER_ 200 interrupt USART0TX_VECTOR void ISR_I2C(void)#else #pragma vector=USART0TX_VECTOR _interrupt void ISR_I2C(void)#endif /上面的程序其实只要编写 : /#pragma vector=USART0TX_VECTOR _interrupt void ISR_I2C(void)就行. switch (I

14、2CIV) case I2CIV_AL: /仲裁中断 break; case I2CIV_NACK: /NACK中断 break; case I2CIV_OA: /自己地址中断 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; i-); while (IFG1 & OFI

15、FG) = 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,分频因子为1 BCSCTL2 += SELM1; /SMCLK的时钟源为TX2CLK,分频因子为1 BCSCTL2 += SELS; /对于系统时钟的选择关系到整个程序运行稳定性./*文件名:msp430f

16、169i2c.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 0 0 1 1 1 (0x1

17、7)* I2CTCTL -I2CWORD,I2CRM,I2CSSEL1,I2XSSEL0, I2CTRX,I2CSTB, I2CSTP, I2CSTT * 0 1 1 0 * 0 * * *作者: jy*状态:通过*/#include #include fpgacode.h#define WR24C512#define LED1_1 (0x20) /* Port 3.5 Output - LED1*/#define LED1_0 (0xdf)#define SDA_1 P3OUT |=BIT1 /串行数据线,SDA = 1#define SDA_0 P3OUT &= BIT1 /SDA = 0

18、#define SCL_1 P3OUT |=BIT3 /串行时钟线,SCL = 1#define SCL_0 P3OUT &= BIT3 /SCL = 0#define SDADIR_IN P3DIR &= BIT1 /SDA,I/O口为输入#define SDADIR_OUTP3DIR |=BIT1 /I/0口为输出#define SDA_IN (P3IN 1) & 0x01) /Read SDA#define SCLDIR_IN P3DIR &= BIT3 /SCL,I/O口为输入#define SCLDIR_OUTP3DIR |=BIT3 /I/0口为输出#define SCL_IN (

19、P3IN 3) & 0x01) /Read SCL#ifdef WR24C512static int numi = 0; /Data Pointer#elsestatic int numj = 0; /Data Pointer#endif#define I2CSLA 0x50/*-功能描述: 检查总线是否空闲-子程序状况: 09-23调试通过-*/void I2c_Idle_Check(void) while (I2CBUSY & I2CDCTL); / I2C ready 在空闲状态:0,空闲;1:忙void DelayTime10us(unsigned char n) unsigned c

20、har i; while(n-) / 5 cycles for(i=0;i256)字节模式 ,new start测试使用 /选择方式 I2CRM=0,最终用户使用 I2CTCTL =I2CSSEL_2; I2CNDAT = 2 + ndatNum; / 最终用户使用,2byte地址 + 128byte数据 I2CPSC = 2; / set scl I2CIFG = 0; I2CSA = 0x50; / Slave address of At24c512 U0CTL |= I2CEN; / enable I2C module, 7 bit addr,master mode 08-26 U0CT

21、L |= MST; while (I2CBUSY & I2CDCTL); / I2C ready 在空闲状态:0,空闲;1:忙 I2CTCTL |= I2CTRX + I2CSTT + I2CSTP ; / I2CRM =0,启动总线,发送从器件地址 while(I2CIFG & NACKIFG) = 0x02); /ack 为低电平,等待地址应答位 ,判断无应答NACKIFG = 1 /*-子程标号 :I2cWrSlaSubAddr -子程功能 :主机发送从机的子地址 -入口参数 :unsigned char sla,unsigned int suba -参数说明 :子地址 -子程序状况 :

22、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 ); /发送器件子地址 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