#define DS_SCL BIT4 //DS_SCL = P5.4 #define DS_SDA BIT6 //DS_SDA = P2.6 #define DS_SCL_IN P5DIR &= ~DS_SCL #define DS_SCL_OUT P5DIR |= DS_SCL #define DS_SCL0 P5OUT &= ~DS_SCL #define DS_SCL1 P5OUT |= DS_SCL #define DS_SDA_IN P2DIR &= ~DS_SDA #define DS_SDA_OUT P2DIR |= DS_SDA #define DS_SDA0 P2OUT &= ~DS_SDA #define DS_SDA1 P2OUT |= DS_SDA #define DS_SDA_BIT P2IN & DS_SDA void Init_CLK(void) { unsigned int i; BCSCTL1 &= ~XTS; do{ IFG1 &= ~OFIFG; for(i=0xFF;i>0;i--); } while((IFG1 & OFIFG)!=0); BCSCTL2 |= SELS+SELM1; _EINT(); P5SEL|=0x30; DS_SCL_OUT; //SCLK对应的IO设置为输出状态 P2DIR&=0xbf; P2OUT|=BIT6; DS_SCL0; //SCLK=0 delay_us(5); } void DS3231_Write(u8 write_address,u8 write_data) { u8 Device_Address = 0xD0; //DS3231写设备地址 iic_Start(); //开始 iic_SendByte(Device_Address); //发送设备地址 iic_Ack(); iic_SendByte(write_address); //发送地址 iic_Ack(); //应答 iic_SendByte(write_data); //发送数据 iic_Ack(); //应答 iic_Stop(); //停止 } u8 DS3231_Read(u8 read_address) { u8 Receive_Data; //数据接收 u8 Device_Address = 0xD0; //DS3231写设备地址 iic_Start(); //开始 iic_SendByte(Device_Address); //发送设备地址 iic_Ack(); //应答 iic_SendByte(read_address); //发送地址 iic_Ack(); //应答 iic_Start(); //重复开始 Device_Address = 0xD1; //DS3231读设备地址 iic_SendByte(Device_Address); //发送地址 iic_Ack(); //应答 iic_in(); Receive_Data = iic_ReceiveByte(); //接收数据 iic_out(); iic_NAck(); //不应答 iic_Stop(); //停止 return Receive_Data; //返回数据 } void delay_us(u8 time) { for(int i=0;i<time;i++) _NOP(); } //------------iic开始----------- void iic_Start(void) { DS_SDA_OUT; DS_SCL_OUT; DS_SCL1; delay_us(5); DS_SDA1; delay_us(10); DS_SDA0; delay_us(5); DS_SCL0; delay_us(5); DS_SDA_IN; } //------------iic结束----------- void iic_Stop(void) { DS_SDA_OUT; DS_SCL_OUT; DS_SCL1; delay_us(10); DS_SDA0; delay_us(5); DS_SDA1; delay_us(5); DS_SDA_IN; } //------------iic应答----------- void iic_Ack(void) { DS_SCL0; DS_SDA0; delay_us(5); DS_SCL1; delay_us(5); DS_SCL0; delay_us(5); } //------------iic不应答--------- void iic_NAck(void) { DS_SCL0; DS_SDA1; delay_us(5); DS_SCL1; delay_us(5); DS_SCL0; delay_us(5); } //------------iic发送----------- void iic_SendByte(u8 SendData) { DS_SDA_OUT; DS_SCL_OUT; DS_SCL0; u8 i; for(i=0;i<8;i++) { DS_SCL0; delay_us(5); if(SendData&0x80) //MSB在前 DS_SDA1; else DS_SDA0; DS_SCL1; delay_us(2); DS_SCL0; SendData<<=1; } //delay_us(5); //DS_SDA1; //delay_us(5); //DS_SDA_IN; } //------------iic接收----------- u8 iic_ReceiveByte(void) { u8 i,temp=0; delay_us(5); DS_SDA1; delay_us(5); for(i=0;i<8;i++) { temp<<=1; DS_SCL0; delay_us(5); DS_SCL1; delay_us(2); temp=DS_SDA_BIT; if(temp==0x80) temp=temp|0x01; else temp=temp&0xFE; } DS_SCL0; delay_us(2); return temp; } void iic_in() { DS_SCL_OUT; DS_SDA_IN; } void iic_out() { DS_SCL_OUT; DS_SDA_OUT; DS_SCL1; delay_us(5); DS_SDA1; delay_us(2); }
共2条
1/1 1 跳转至页
msp430f149+ds3231模拟iic为什么没有sda信号?

关键词: msp430 iic ds3231
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |