📄 i2c.c
字号:
#include "reg51.h"
#include <string.h>
extern bit gFmMute;
BYTE gFmDat,gRdFreq,gFmSt;
sbit gI2cCLK = 0x81;
sbit gI2cSDA = 0x80;
WORD gDispFre;
void I2C_Start()
{
gI2cCLK = 0;
WaitUs(1);
gI2cSDA = 1;
WaitUs(1);
gI2cCLK = 1;
WaitUs(5);
gI2cSDA = 0;
WaitUs(5);
}
void I2C_Stop()
{
gI2cCLK = 0;
WaitUs(1);
gI2cSDA = 0;
WaitUs(5);
gI2cCLK = 1;
WaitUs(3);
gI2cSDA = 1;
}
bit I2C_Ack()
{
gI2cCLK = 0;
WaitUs(2);
gI2cSDA = 1;
WaitUs(2);
gI2cCLK = 1;
WaitUs(2);
if (!gI2cSDA) //ACK
return 1;
return 0;
}
void I2C_Set_Ack()
{
gI2cCLK = 0;
WaitUs(2);
gI2cSDA = 0;
WaitUs(2);
gI2cCLK = 1;
WaitUs(2);
}
void I2C_Set_nAck()
{
gI2cCLK = 0;
WaitUs(2);
gI2cSDA = 1;
WaitUs(4);
gI2cCLK = 1;
WaitUs(2);
}
bit Write_8bit(BYTE gData)
{
BYTE i;
for (i=0; i<8; i++){
gI2cCLK = 0;
WaitUs(1);
if (gData & 0x80){
gI2cSDA = 1;
}else{
gI2cSDA = 0;
}
WaitUs(1);
gData <<= 1;
gI2cCLK = 1;
WaitUs(2);
}
return I2C_Ack();
}
BYTE Read_8bit()
{
BYTE gData,i;
gData = 0;
for (i=0; i<8; i++){
gI2cCLK = 0;
WaitUs(2);
gI2cSDA = 1;
WaitUs(1);
gI2cCLK = 1;
WaitUs(1);
gData <<= 1;
if (gI2cSDA)
gData |= 0x01;
WaitUs(1);
}
return gData;
}
//Write Register of FM Module
bit FM_SetFreq(WORD Freq)
{
WORD Value;
bit gBack;
BYTE temp;
Value = (WORD)(1.2207*(long)Freq + 27.46582);
gDispFre = Value;
temp = HIBYTE(Value);
if(gFmMute) temp |= 0x80;
I2C_Start();
gBack = Write_8bit(0xc0);
Write_8bit(temp);
Write_8bit(LOBYTE(Value));
Write_8bit(0x50);
Write_8bit(0x10);
Write_8bit(0x00);
I2C_Stop();
return gBack;
}
//Read Register of FM Module
void FM_GetFreq()
{
I2C_Start();
Write_8bit(0xc1);
Read_8bit();
I2C_Set_Ack();
Read_8bit();
I2C_Set_Ack();
gFmDat = Read_8bit();
I2C_Set_Ack();
gFmSt = Read_8bit();
I2C_Set_Ack();
Read_8bit();
I2C_Set_nAck();
I2C_Stop();
gFmDat &= 0x7f;
gFmSt &= 0xf0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -