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:47 编辑
之所以I2C卡住,有可能是发送的器件地址不正确,导致芯片无ACK响应。
你把A0引脚上的上拉电阻R2拆掉,或者传输硬件地址改为0xC2试试
因为R2使A0为高电平,使得器件地址变为了0xC2,和你的程序中写入的地址不一致。
一般来说A0直接连接VCC或者GND都可以,不要搞那么多没用的电阻。
A0接VCC时,写入地址为0xC2
A0接GND时,写入地址为0xC0
晓飛飛 发表于 2024-3-24 23:43
之所以I2C卡住,有可能是发送的器件地址不正确,导致芯片无ACK响应。
这里的电阻R2和R3仅仅只是在原理图上设计,实际焊接时仅焊接一个,我实际板子焊接的是r3也就是A0接GND,地址是0xc0,但是我在实际使用时,向0xc0写两个字节数据,不管数据是什么,DAC输出都为0,如果地址错误,那DAC输出为2.5V P1.4和P1.5是否设置成了开漏输出模式? 目前已经找到原因了,软件iic可以使用了,硬件iic还是不能使用 woodzn 发表于 2024-3-27 22:19
目前已经找到原因了,软件iic可以使用了,硬件iic还是不能使用
楼主能否说下什么原因?最近也在排查这方面的问题
楼主是什么问题可以说一下嘛,我的软件iic也用不了了
页:
[1]