文库资源下载网站源码分享 文库资料下载

大家好,感谢邀请,今天来为大家分享一下文库资源下载网站源码分享的问题,以及和文库资料下载的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

I2C接口是单片机开发中很常用的一种接口,比如一些EEPROM,ADC,DAC等器件都通过I2C接口对芯片进行控制,或读写里面的数据。

I2C协议比较简单,容易实现,可以通过MCU的IO口来模拟实现,避免操作芯片里面的I2C控制器。

本文以MSP430为例,写了一个完整的IO模拟I2C的代码。当使用其他类型的MCU时,也可以轻松的将其移植过去。

原理图

以下为实现IO模拟I2C协议的源程序

/**************************************************************************************************\nMCU型号:MSP430F6736A\n编译平台:IARforMSP4306.40.1\n实验项目:IO模拟I2C协议\n**************************************************************************************************/\n34;msp430.h&include&34;\n34;stdio.h&include&34;\n34;string.h&include&34;\n\ndefineuintunsignedint\n\n//———————————\n//初始化MCU\n//———————————\nvoidMcu_Init(void)\n{\n//———————————\n//初始化系统时钟\n//———————————\nWDTCTL=WDTPW+WDTHOLD;//禁止看门狗\n__bic_SR_register(GIE);//禁止所有中断\n\n//初始化XT1,并使其正常工作\nUCSCTL6&=~(XT1OFF+XT1BYPASS+XTS);\nUCSCTL6|=XT1DRIVE_3;\nUCSCTL6|=XCAP_3;\n\ndo\n{\nUCSCTL7&=~XT1LFOFFG;\n}while(UCSCTL7&XT1LFOFFG);\n\n//XT1CLK作为DCO输入\nUCSCTL3=SELREF__XT1CLK+FLLREFDIV__1;\n\n//禁止FLL控制\n__bis_SR_register(SCG0);\n\n//DCO=31,MOD=0\nUCSCTL0=0x1f00;\n\n//DCO范围:23.7MHz-54.1MHz\nUCSCTL1=DCORSEL_5;\n\n//fDCO分频系数D=2,N=374\n//fDCOCLK=D*(N+1)*FLLRef=2*(374+1)*32768=24576000Hz\nUCSCTL2=FLLD__2|374;\n\n//允许FLL控制\n__bic_SR_register(SCG0);\n\n__delay_cycles(384000);\n\ndo\n{\nUCSCTL7&=~(DCOFFG);\n}while(UCSCTL7&DCOFFG);\n\n//ACLK=XT1CLKSMCLK=DCOCLKMCLK=DCOCLK\nUCSCTL4=SELA__XT1CLK+SELS__DCOCLK+SELM__DCOCLK;\n\n//———————————————————-\n//P2功能【外接信号】功能方向初始值\n//P2.1|PM_UCB0SIMO|PM_UCB0SDA|COM7|【I2C_SDA】0[I/O]1[O][1]\n//P2.0|PM_UCB0SOMI|PM_UCB0SCL|COM6|【I2C_SCL】0[I/O]1[O][1]\n//———————————————————-\nP2SEL=0;\nP2DIR=0xff;\nP2OUT=0xff;\n\nP2REN|=0x02;\n}\n\n//———————————\n//I2C协议\n//———————————\ndefineCLR_I2C_SCL(P2OUT&=~BIT0)\n\ndefineCLR_I2C_SDA(P2OUT&=~BIT1)\n\ndefineI2C_SDA_IS_CLR((P2IN&BIT1)==0)\ndefineI2C_SDA_OUTPUT(P2DIR|=BIT1)\n\nucharI2C_Byte;\n\nvoidStart_I2C(void)\n{\nSETB_I2C_SDA;\nSETB_I2C_SCL;\nCLR_I2C_SDA;\nCLR_I2C_SCL;\n}\n\nvoidStop_I2C(void)\n{\nCLR_I2C_SDA;\nSETB_I2C_SCL;\nSETB_I2C_SDA;\n}\n\nvoidSend_ACK(void)\n{\nCLR_I2C_SDA;\nSETB_I2C_SCL;\nCLR_I2C_SCL;\n}\n\nvoidSend_NACK(void)\n{\nSETB_I2C_SDA;\nSETB_I2C_SCL;\nCLR_I2C_SCL;\n}\n\nvoidTo_I2C(void)\n{\nuchari,bitset;\n\nbitset=0x80;\n\nfor(i=0;i<8;i++)\n{\nif(bitset&I2C_Byte)SETB_I2C_SDA;\nelseCLR_I2C_SDA;\nbitset/=2;\nSETB_I2C_SCL;\nCLR_I2C_SCL;\n}\n\n//将I2C_SDA切换到输入模式\nI2C_SDA_INPUT;\n\nSend_NACK();\n\n//将I2C_SDA切换到输出模式\nI2C_SDA_OUTPUT;\n}\n\nvoidFrom_I2C(void)\n{\nuchari,bitset;\n\n//将I2C_SDA切换到输入模式\nI2C_SDA_INPUT;\n\nSETB_I2C_SDA;\n\nbitset=0x80;\nI2C_Byte=0x00;\n\nfor(i=0;i<8;i++)\n{\nSETB_I2C_SCL;\nif(I2C_SDA_IS_SET)I2C_Byte|=bitset;\nCLR_I2C_SCL;\nbitset/=2;\n}\n\n//将I2C_SDA切换到输出模式\nI2C_SDA_OUTPUT;\n}\n\n//———————————\n//写EEPROM(24CL04)\n//———————————\nvoidWriteEE(uintEEAddr,uchar*RamAddr,uintLen)\n{\nuinti;\n\nif(Len==0)return;\n\nStart_I2C();\n\nI2C_Byte=(uchar)((EEAddr&0xff00)>>7);\nI2C_Byte&=0x02;\nI2C_Byte+=0xa0;\nTo_I2C();\n\nI2C_Byte=(uchar)(EEAddr&0x00ff);\nTo_I2C();\n\nfor(i=0;i<Len;i++)\n{\nI2C_Byte=RamAddr[i];\nTo_I2C();\n}\n\nStop_I2C();\n}\n\n//———————————\n//读EEPROM(24CL04)\n//———————————\nvoidReadEE(uintEEAddr,uchar*RamAddr,uintLen)\n{\nuinti;\n\nif(Len==0)return;\n\nStart_I2C();\n\nI2C_Byte=(uchar)((EEAddr&0xff00)>>7);\nI2C_Byte&=0x02;\nI2C_Byte+=0xa0;\nTo_I2C();\n\nI2C_Byte=(uchar)(EEAddr&0x00ff);\nTo_I2C();\n\nStart_I2C();\n\nI2C_Byte=(uchar)((EEAddr&0xff00)>>7);\nI2C_Byte&=0x02;\nI2C_Byte+=0xa1;\nTo_I2C();\n\nfor(i=0;i<Len;i++)\n{\nFrom_I2C();\n\nRamAddr[i]=I2C_Byte;\n\nif(i!=(Len-1))\n{\nSend_ACK();\n}\n}\n\nSend_NACK();\n\nStop_I2C();\n}\n\n//———————————\n//主流程\n//———————————\nvoidmain(void)\n{\nuchari,ctmp,sbuf[10];\n\n//初始化MCU\nMcu_Init();\n\n//初始化LCD\nLcd_Init();\n\nDisp_RomString(Msg_WriteEE,LINE1,NORMAL);\nDisp_RomString(Msg_ReadEE,LINE4,NORMAL);\n\ni=0;\nwhile(1)\n{\nctmp=i;\nWriteEE(0,&ctmp,1);\nsprintf((char*)sbuf,&34;,ctmp);\nDisp_RamString8x16(sbuf,LINE1+11,NORMAL);\n\nDELAY_400ms;\n\n\nctmp=0;\nReadEE(0,&ctmp,1);\nsprintf((char*)sbuf,&34;,ctmp);\nDisp_RamString8x16(sbuf,LINE4+11,NORMAL);\n\nDELAY_400ms;\n\ni++;\n}\n}\n

视频演示内容:先向EEPROM的地址0写入一个字节,然后从此地址读出,看是否与写入的内容一致

视频加载中…

关于文库资源下载网站源码分享的内容到此结束,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平