#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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 |