实验箱例程“AI8051U-DEMO-CODE-V1.2”的“84-USB录放音声卡-TLV320AIC23B-内部36.864M-外接32768Hz晶振”中有软件模拟I2C:
- sbit P_AIC23_SCL = P5^1; //2024-7-21
- sbit P_AIC23_SDA = P5^0;
-
-
- /****************************/
-
- void AIC23_Delay(void)
- {
- u16 dly;
- dly = 10; //取1对应SCL H为0.5us,L为1.5us,读写仍正常.为了可靠,取8
- while(--dly) ;
- }
-
-
- /****************************/
- void AIC23_Start(void) //start the I2C, SDA High-to-low when SCL is high
- {
- P_AIC23_SDA = 1; //SDA = 1;
- AIC23_Delay();
- P_AIC23_SCL = 1; //SCL = 1;
- AIC23_Delay();
- AIC23_Delay();
- AIC23_Delay();
- AIC23_Delay();
- P_AIC23_SDA = 0; //SDA = 0;
- AIC23_Delay();
- AIC23_Delay();
- AIC23_Delay();
- P_AIC23_SCL = 0; //SCL = 0;
- AIC23_Delay();
- }
-
-
- void AIC23_Stop(void) //STOP the I2C, SDA Low-to-high when SCL is high
- {
- P_AIC23_SCL = 0; //SCL = 0;
- AIC23_Delay();
- P_AIC23_SDA = 0; //SDA = 0;
- AIC23_Delay();
- P_AIC23_SCL = 1; //SCL = 1;
- AIC23_Delay();
- AIC23_Delay();
- AIC23_Delay();
- P_AIC23_SDA = 1; //SDA = 1;
- AIC23_Delay();
- }
-
- u8 AIC23_Check_ACK(void) //Check ACK, If status=0: right, if status=1: error
- {
- u8 status;
- P_AIC23_SDA = 1; //SDA = 1;
- AIC23_Delay();
- P_AIC23_SCL = 1; //SCL = 1;
- AIC23_Delay();
- status = 0;
- if(P_AIC23_SDA) status = 1;
- P_AIC23_SCL = 0; //SCL = 0;
- AIC23_Delay();
- return status;
- }
-
- /****************************/
- void AIC23_WriteAbyte(u8 dat) //write a byte to I2C
- {
- u8 i;
- for(i=0; i<8; i++)
- {
- if(dat & 0x80) P_AIC23_SDA = 1; //SDA = 1;
- else P_AIC23_SDA = 0; //SDA = 0;
- AIC23_Delay();
- P_AIC23_SCL = 1; //SCL = 1;
- dat <<= 1;
- AIC23_Delay();
- P_AIC23_SCL = 0; //SCL = 0;
- AIC23_Delay();
- }
- }
-
- /****************************/
- u8 AIC23_RegWrite(u8 RegAddr, u8 dat) //返回0: 正确, >0: 错误
- {
- u8 status;
-
- status = 1;
- AIC23_Start();
- AIC23_WriteAbyte(AIC23_WR); //device address + WR
- if(AIC23_Check_ACK() == 0)
- {
- AIC23_WriteAbyte(RegAddr); //register address
- if(AIC23_Check_ACK() == 0)
- {
- AIC23_WriteAbyte(dat); //data
- if(AIC23_Check_ACK() == 0) //data
- status = 0;
- }
- }
- AIC23_Stop();
- return status;
- }
复制代码
TLV320AIC23.c
(4.68 KB, 下载次数: 4)
|