woodzn 发表于 2024-3-24 05:28:41

STC8H8K64U软件I2C驱动MCP4725A0T搞定,硬件I2C没搞定

STC8H8K64U TSSOP20 软件IIC驱动mcp4725a0t不稳定

驱动代码如下,硬件IIC会直接卡住无法使用,软件IIC时而有用时而失效,
失效时无论IIC写数据什么,DAC输出都是0

软件IIC具体实现:SDA和SCL如原理图定义
#define D 10
void I2C_Init(void)    //初始化IIC
{

}
void I2C_Start(void) //起始信号
{
      SDA = 1;
      SCL = 1;
      delay_us(D);       //大于4.7us
      SDA = 0;         //SCL高电平期间,SDA发生负跳变
      delay_us(D);       //大于4us
      SCL = 0;
      delay_us(D);
}

void I2C_SendByte(unsigned char temp)//发送数据
{
      unsigned char i;
      for(i=0;i<8;i++)
      {
                SDA = (bit)(temp&0x80);
                temp <<= 1;
                SCL = 1;         //SCL高电平期间传送数据,并保持稳定
                delay_us(D);   //大于4us
                SCL = 0;         //SCL低电平期间数据发生改变
                delay_us(D);
      }
}

bit I2C_ACKR(void)//接收应答信号
{
      bit flag;
      SCL = 1;          //SCL高电平期间接收数据
      SDA = 1;          //读取数据前置一
      delay_us(D);
      flag = SDA;
      SCL = 0;
      delay_us(D);
      return(flag);
}

void I2C_Stop(void)//终止信号
{
      SCL = 1;
      delay_us(D);       //大于4us
      SDA = 1;         //SCL高电平期间,SDA发生正跳变
      delay_us(D);       //大于4.7us
      SDA = 0;
}

unsigned char I2C_ReceiveByte(void)//接收数据
{
      unsigned char i;
      unsigned char temp = 0x00;
      for(i=0;i<8;i++)
      {
                SCL = 1;         //SCL高电平期间接收数据
                SDA = 1;         //读取数据前置一
                delay_us(D);   //大于4us
                temp |= SDA;
                SCL = 0;         //SCL低电平期间数据发生改变
                temp <<= 1;
                delay_us(D);   //大于4us
      }
      return(temp);
}

void I2C_ACKS(bit A)      //发送应答信号
{
      if(A == 1)
                SDA = 1;
      else
                SDA = 0;
      SCL = 1;            //SCL高电平期间传送应答信号
      delay_us(D);
      SCL = 0;
      delay_us(D);
}


晓飛飛 发表于 2024-3-24 23:43:25

本帖最后由 晓飛飛 于 2024-3-24 23:47 编辑

之所以I2C卡住,有可能是发送的器件地址不正确,导致芯片无ACK响应。


你把A0引脚上的上拉电阻R2拆掉,或者传输硬件地址改为0xC2试试
因为R2使A0为高电平,使得器件地址变为了0xC2,和你的程序中写入的地址不一致。
一般来说A0直接连接VCC或者GND都可以,不要搞那么多没用的电阻。
A0接VCC时,写入地址为0xC2
A0接GND时,写入地址为0xC0

woodzn 发表于 2024-3-25 08:00:36

晓飛飛 发表于 2024-3-24 23:43
之所以I2C卡住,有可能是发送的器件地址不正确,导致芯片无ACK响应。




这里的电阻R2和R3仅仅只是在原理图上设计,实际焊接时仅焊接一个,我实际板子焊接的是r3也就是A0接GND,地址是0xc0,但是我在实际使用时,向0xc0写两个字节数据,不管数据是什么,DAC输出都为0,如果地址错误,那DAC输出为2.5V

晓飛飛 发表于 2024-3-25 15:49:33

P1.4和P1.5是否设置成了开漏输出模式?

woodzn 发表于 2024-3-27 22:19:50

目前已经找到原因了,软件iic可以使用了,硬件iic还是不能使用

dongyaozhang17 发表于 2024-6-27 22:43:36

woodzn 发表于 2024-3-27 22:19
目前已经找到原因了,软件iic可以使用了,硬件iic还是不能使用

楼主能否说下什么原因?最近也在排查这方面的问题

魏十一 发表于 2024-7-15 22:09:16

楼主是什么问题可以说一下嘛,我的软件iic也用不了了
页: [1]
查看完整版本: STC8H8K64U软件I2C驱动MCP4725A0T搞定,硬件I2C没搞定