本帖最后由 woodzn 于 2024-3-24 23:23 编辑
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);
- }
复制代码
|