历史上的今天
今天是:2025年01月20日(星期一)
2020年01月20日 | msp430——软件模拟II2C实例
2020-01-20 来源:eefocus
#include #define SDA BIT1 #define SCL BIT2 #define SEG_A 0xA0 //0x0200---0x027F #define SEG_B 0xB0 //0x0280---0x02FF #define SEG_C 0xC0 //0x0300---0x037F //0x0380---0x0400 __no_init char wokao@0x243; //============================= char *send_ptr; char DEVICE_ADR=0; char WORD_ADR=0; char REC_DATA=0; char START_flag = 0; char STOP_flag = 0; char PreState = 0; char NowState = 0; //*********************函数声明************************************* void ACK(void); //**************************************************************** void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; //======================MCLK=16MHz===================================== DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ; //MCLK=DCO=16MHz P3DIR &= ~(SDA+SCL); while(1) { NN=10; PreState = READ_SDA; while(READ_SCL && NN--) { NowState = READ_SDA; if(PreState && !NowState) { START_flag = 1; _DINT(); } if(!PreState && NowState) { STOP_flag = 1; _EINT(); } PreState = NowState; if(START_flag) { START_flag=0; while(READ_SCL); //START时的SCL高电平状态就等待 for(gg=8;gg>0;gg--) //接收器件地址 { while(!READ_SCL); //SCL低电平状态就等待 DEVICE_ADR<<=1; if(READ_SDA) //数据的第一个CLK高电平来临 DEVICE_ADR |= 0x01; while(READ_SCL); //SCL高电平状态就等待 } ACK(); //对设备地址ACK应答信 //-----------以上收到了设备地址,并知晓主机要对从机进行读还是写操作--- for(gg=8;gg>0;gg--) //接收内存单元地址 { while(!READ_SCL); WORD_ADR<<=1; if(READ_SDA) WORD_ADR |= 0x01; while(READ_SCL); } //-----------以上就已经接收到内存单元地址------------ ACK(); //对内存单元ACK应答信号 if(DEVICE_ADR & 0x01) //从机发数据给主机 R/W=1 { if(DEVICE_ADR==SEG_A+0x01) { send_ptr =(char*)(0x0200 + WORD_ADR); } else if(DEVICE_ADR==SEG_B+0x01) { send_ptr =(char*)(0x0280 + WORD_ADR); } else if(DEVICE_ADR==SEG_C+0x01) { send_ptr =(char*)(0x0300 + WORD_ADR); } //--------以上是判断出为主机读从机,要把要读的地址单元赋给指针--- for(gg=8;gg>0;gg--) { while(!READ_SCL); if( *send_ptr & 0x80) _NOP(); else { P3DIR |= SDA; //输出0 } while(READ_SCL); //SCL为1,就保持SDA输出不变 P3DIR &= ~SDA; //SCL为0,就把SDA从新切换到接收状态 *send_ptr <<=1; } ACK(); //从机数据发送完毕,应答信号 _NOP(); //------------------以上是从机发数据给主机----------------- } else //主机写从机 R/W=0 { for(gg=8;gg>0;gg--) //接收主机要写到该器件内存单元的数据 { while(!READ_SCL); REC_DATA <<=1; if(READ_SDA) REC_DATA |= 0x01; while(READ_SCL); } if(DEVICE_ADR==SEG_A) { send_ptr =(char*)(0x0200 + WORD_ADR); *send_ptr = REC_DATA; } else if(DEVICE_ADR==SEG_B) { send_ptr =(char*)(0x0280 + WORD_ADR); *send_ptr = REC_DATA; } else if(DEVICE_ADR==SEG_C) { send_ptr =(char*)(0x0300 + WORD_ADR); *send_ptr = REC_DATA; } ACK(); _NOP(); while(!READ_SCL); } }// if(START_flag) }//while(NN--) _EINT(); _NOP(); }//while(1) } //**************************************************** void ACK(void) { // while(READ_SCL); while(!READ_SCL); P3DIR |= SDA; //第9个CLK变高的情况下,SDA输出0 while(READ_SCL); P3DIR &= ~SDA; //第9个CLK变低的情况下,SDA输出1 }
上一篇:MSP430 使用一些理解
下一篇:MSP430中断原理分析
史海拾趣
|
cpu为奔腾的,跑vxworks,版本是5.5, 因为项目需要,用fpga开发了一个pci接口的16路串口 在cpu对该串口进行读写的测试过程中,数据的正确性没问题 存在的问题是读pci口的速度太慢,每读一个32位双字,需要16个pci时钟周期 写pci口很快,一般3 ...… 查看全部问答> |
|
在gui移植的时候,原来的芯片是支持480*272的,现移植到支持800*480的芯片上,可以移植后一切正常,就是在超过480宽的像素位置之后,所有的字体都向左滚动,并且第一个字符不会显示,直接从第二个字符开始滚动,哪位高手知道这是为什么啊??… 查看全部问答> |
|
求救!!那位高人认识这个文件是那家公司的FS文件系统和版本号? 以前我公司的一个工程师在基于ARM9 2410上面整合的UCOS II和FS文件系统,但所有系统文件的原码都已经打包,只留了个API接口集合的头文件(如下),里面没有任何公司和版本信息,现在要基于该系统平台开发一新系统,但没有详细的平台使用信息,感觉无从下手, ...… 查看全部问答> |
|
replyreload += \',\' + 692905;作为一种新的光源,近年来各大公司和研究机构对LED电源和驱动电路的研究方兴未艾。与荧光灯的电子镇流器不同,LED驱动电路的主要功能是将交流电压转换为直流电压,并同时完成与LED的电压和电流的匹配。随着硅集成电 ...… 查看全部问答> |
|
看到版主--永远的不知 回复的一个帖子,“ 您按照TI stellarisware里的boot_seral和boot_demo1例程下载试试,下载工具用lmflash programmer,下载这两个程序前,先把flash擦干净,先通过jtag下载boot_seral,再通过lmflash programmer选择 ...… 查看全部问答> |
|
请问各路大神,Contiki官方源码是针对于CC2538dk平台,没有加PA。我目前使用的板子是CC2538+CC2592,请问如何修改Contiki的代码?有没有人做过这方面的工作,望指点指点… 查看全部问答> |
|
【TI C2000的使用经验】2806X产品说明书中致命错误 玩C2000产品也有好久了。现在呢能想到一点就写一点。论坛里最佩服的大哥dontium在写程序上确实给了我不少启示,略表感谢下~。 首先发上来的是我觉得最致命的错误。 SysCtrlRegs.EPWMCFG.bit.CONFIG = 1; 该寄存器在technical reference gu ...… 查看全部问答> |




