msp430f149+ds3231模拟iic没有sda信号

2019-07-15 15:13发布

本人刚接触430不久 如果还有很多错误请大神指出
#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);}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。