




免费预览已结束,剩余25页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序和流程图: 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 AT24c16 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(); /写入数据 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(); /读出数据,随机读 Data0 = EEPROM_RandomRead(0x0000); /地址自动加1 /读出数据,当前地址读 Data1 = EEPROM_CurrentAddressRead(); /读出数据,当前地址读 Data2 = EEPROM_CurrentAddressRead(); /读出数据,当前地址读 Data3 = EEPROM_CurrentAddressRead(); /读出数据,当前地址读 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模式 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;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_ByteWrite(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;unsigned 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 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(); /接收一个字节的数据 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; /使能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 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 (I2CIV) 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 & 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,分频因子为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 0 0 1 1 1 (0x17)* 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#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 (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 char 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 U0CTL |= 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 -参数说明 :子地址 -子程序状况 :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);/*-子程标号 :I2cWriteStr (用户函数) -子程功能 :向I2C从器件写入数据 -入口参数 :unsigned char *ps,unsigned char num -参数说明 :写入数据的地址指针,数据个数 -子程序状况 : 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;numitempnum;numi+) I2cBusSendByte(*ps); while(I2CIFG& 0x02) = NACKIFG) / 等待数据的应答 I2CTCTL |= I2CSTP; / 无应答,结束总线 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; for (j = 0;j 462;j+) / page write tempAddr = 128*j; while (I2CBUSY & I2CDCTL); / I2C ready? I2cSendSubAddr(tempAddr,0x80); I2cSendStr(FPGACfg+tempAddr,0x80); P4OUT = 0x80; for (m=0;m125;m+) for (n=0;n110;n+); P4OUT = 0x80; tempAddr = 128*j; while (I2CBUSY & I2CDCTL); / I2C ready? I2cSendSubAddr(tempAddr,0x4f); I2cSendStr(FPGACfg+tempAddr,0x4f); P4OUT = 0x80; for (m=0;m125;m+) for (n=0;n 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 = 1 I2CTCTL |= I2CSTP; / 结束总线 I2cBusSendByte( Hi_suba ); /发送器件子地址 while(I2CIFG & NACKIFG) = 0x02) / ack 为低电平,等待地址应答位 ,判断 无应答NACKIFG = 1 I2CTCTL |= I2CSTP; / 结束总线 I2cBusSendByte( Lo_suba ); /发送器件子地址 while(I2CIFG & NACKIFG) = 0x02) / ack 为低电平,等待地址应答位 ,判断 无应答NACKIFG = 1 I2CTCTL |= I2CSTP; / 结束总线 DelayTime10us(250); DelayTime10us(250); DelayTime10us(250); DelayTime10us(250);/*-子程标号 :I2cSlaSubAddr -子程功能 :主器件接收初始化 -入口参数 :无 -子程序状况 : -说明 : -*/void InitI2cRece(unsigned char num) P3OUT = 0x00; / clear P3 output register P3SEL = 0x0A; / P3.1=SDA, P3.3=SCL,Select I2C pins, Setup I2C module U0CTL |= I2C + SYNC; / select I2C mode;XA=0,7bit_addresing; U0CTL &= I2CEN; / i2c功能使能无效 / I2CTCTL = I2CRM + I2CSSEL_2;/ I2CRM=1 x(x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 赌博罪考试题及答案
- 东莞高职高考试题及答案
- 2025年整形外科职称考试题库及答案
- 2025年河南省车管所事业单位招聘考试题库及答案解析
- 2025年经济经济法学试题及答案
- 污水厂化验员考试试题及答案
- 2025年医疗美容医院整形外科考试题(附答案)
- 2025年科研项目管理人员考核试卷及答案
- 2025年科技成果转化与管理考试真题及答案
- 2025年普通动物医学试题及答案
- 期货实物交割管理制度
- T/CHES 43-2020水利水电工程白蚁实时自动化监测预警系统技术规范
- 人工智能及机器人课件
- 2024年注会考试《税法》真题及答案
- 2025淘宝天猫·运动户外行业鞋服趋势白皮书
- 机械设备安装施工服务承诺书范文
- 2025年地址标签纸项目市场调查研究报告
- 《绿色经济》课件
- 2025-2030石灰石行业市场发展分析及发展趋势前景预测报告
- 中小学教师岗位安全工作指南培训
- DB14T 1596-2024玉米间作花生机械化栽培技术规程
评论
0/150
提交评论