#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中断原理分析
推荐阅读最新更新时间:2024-11-10 10:50
设计资源 培训 开发板 精华推荐
- 具有压缩和噪声门控的低噪声模拟 MEMS 麦克风和前置放大器应用电路
- 采用MIC4575可调降压稳压器的典型应用电路
- 具有 2.5 uA 静态电流的 LT8614 42V、4A 同步降压型静音开关的典型应用
- 使用 ROHM Semiconductor 的 BD5244 的参考设计
- DER-29 - 33W双输出DC-DC功率正向转换器,具有同步整流正向功能
- LTC6088 的典型应用 - 四路 14MHz、轨至轨 CMOS 放大器
- MPC56xxVXBOARDS: MPC56xx VertiCal校准板
- ADP1828 20A输出同步降压DC-DC控制器典型应用电路
- TB6569FTG 中等电流驱动有刷直流电机驱动器评估板
- 使用 ON Semiconductor 的 NCP100 的参考设计