📄 sc16is75x.c
字号:
#define RHR 0x00
#define THR 0x00
#define IER 0x01
#define FCR 0x02
#define IIR 0x02
#define LCR 0x03
#define MCR 0x04
#define LSR 0x05
#define MSR 0x06
#define SPR 0x07
#define TLR 0x07
#define EFCR 0x0F
//-------------------------
//Special register set
//-------------------------
#define DLL 0x00
#define DLH 0x01
//-------------------------
//Enhanced register set
//-------------------------
#define EFR 0x02
//-------------------------
//Function:
//-------------------------
#define SC16IS752 0x9a//0x22
#define ChannelA 0x00
#define DELAYTIME 20
#define I2C_NEW_DATA 0x01
#define I2C_NO_DATA 0x20
void fDelayTimeOfsc16is752(unsigned char DelayNum)
{
unsigned char i;
for(i=0;i<=DelayNum;i++){;}
}
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c(void)
{
SCL=0; //准备发送数据
fDelayTimeOfsc16is752(DELAYTIME);
SDA=1; /*发送起始条件的数据信号*/
fDelayTimeOfsc16is752(DELAYTIME);
SCL=1; //数据开始有效
/*起始条件建立时间大于4.7us,延时*/
fDelayTimeOfsc16is752(DELAYTIME);
SDA=0; /*发送起始信号*/
fDelayTimeOfsc16is752(DELAYTIME); /* 起始条件锁定时间大于4μs*/
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c(void)
{
SCL=0; //准备数据,此时数据变化
SDA=0; //准备数据
fDelayTimeOfsc16is752(DELAYTIME); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
fDelayTimeOfsc16is752(DELAYTIME);
SDA=1; /*发送I2C总线结束信号*/
fDelayTimeOfsc16is752(DELAYTIME);
}
void WaitAck(void)
{
unsigned char errtime=255; //因故障接收方无ACK,超时值为255。
SCL=0; //等待对端输出ACK
SDA=1; //防止数据线被本地钳住
fDelayTimeOfsc16is752(DELAYTIME);
SCL=1; //读取应答位
fDelayTimeOfsc16is752(DELAYTIME);
while(SDA)
{
errtime--;
if(!errtime)
{
Stop_I2c();
return;
}
}
}
/********************************************************************
应答子函数
函数原型: void Ack_I2c(bit a);
功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{
SCL=0; //数据线可以输出
SDA=a; /*在此发出应答或非应答信号 */
fDelayTimeOfsc16is752(DELAYTIME);
SCL=1; //数据输出有效
fDelayTimeOfsc16is752(DELAYTIME); /*时钟低电平周期大于4.7μs*/
}
/*******************************************************************
字节数据发送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答
********************************************************************/
void SendOneByte(unsigned char c)
{
unsigned char BitCnt;
fDelayTimeOfsc16is752(DELAYTIME);
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
SCL=0; //准备数据输出
if((c<<BitCnt)&0x80) SDA=1; /*判断发送位*/
else SDA=0;
fDelayTimeOfsc16is752(DELAYTIME);
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
fDelayTimeOfsc16is752(DELAYTIME); /*保证时钟高电平周期大于4μs*/
}
}
/*******************************************************************
字节数据接收函数
函数原型: unsigned char fReceiveOneByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
unsigned char fReceiveOneByte(void) // 155
{
unsigned char retc;
unsigned char BitCnt;
retc=0;SDA=1; /*置数据线为输入方式*/
fDelayTimeOfsc16is752(DELAYTIME);
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL=0; /*置时钟线为低,准备接收数据位*/
fDelayTimeOfsc16is752(DELAYTIME); /*时钟低电平周期大于4.7μs*/
SCL=1; /*置时钟线为高使数据线上数据有效*/
fDelayTimeOfsc16is752(DELAYTIME);
retc=retc<<1;
if(SDA)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
fDelayTimeOfsc16is752(DELAYTIME);
}
return(retc);
}
/*******************************************************************
用户接口函数
*******************************************************************/
/*******************************************************************
向有子地址器件读取字节数据函数
函数原型: unsigned char ReadRegister(unsigned char Reg,unsigned char channel)
功能: 从启动总线到发送地址,读数据,结束总线的全过程.
从器件地址sla,读出的内容放入s指向的存储区,
读no个字节。如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
unsigned char fReadRegister(unsigned char Reg,unsigned char channel) //461+3WaitAck();
{
unsigned char Value;
Reg=Reg<<3;
Reg=Reg+channel;
Start_I2c(); /*启动总线*/
SendOneByte(SC16IS752); /*发送器件地址*/
WaitAck();
SendOneByte(Reg); /*发送器件子地址*/
WaitAck();
Start_I2c(); /*重新启动总线*/
SendOneByte(SC16IS752+1);
WaitAck();
Value=fReceiveOneByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(Value);
}
//-----------------------------------------
//channel A=0x00, channel B=0x02;
//-----------------------------------------
void fWriteOneByteToRegister(unsigned char Reg,unsigned char channel,unsigned char Value)//300
{
Reg<<=3;
Reg=Reg+channel;
Start_I2c(); /*启动总线*/
SendOneByte(SC16IS752); /*发送器件地址*/
WaitAck();
SendOneByte(Reg); /*发送器件子地址*/
WaitAck();
SendOneByte(Value); /*发送数据*/
WaitAck();
Stop_I2c(); /*结束总线*/
}
void fWriteNumBytesToRegister(unsigned char Reg,unsigned char channel,unsigned char *Value,unsigned char num)
{
unsigned char i;
Reg=Reg<<3;
Reg=Reg+channel;
Start_I2c(); /*启动总线*/
SendOneByte(SC16IS752); /*发送器件地址*/
WaitAck();
SendOneByte(Reg); /*发送器件子地址*/
WaitAck();
for(i=0;i<num;i++)
{
SendOneByte(*Value++); /*发送数据*/
WaitAck();
}
Stop_I2c(); /*结束总线*/
}
//初始化
void fInitialSC16IS752(void)
{
fWriteOneByteToRegister(LCR,ChannelA,0xBF); //Enter enhance mode
fWriteOneByteToRegister(EFR,ChannelA,0xD0); //1101 0000,Auto CTS,Auto RTS ,enable mode
fWriteOneByteToRegister(LCR,ChannelA,0x03); //8 bit,no parity,1 stop bits
fWriteOneByteToRegister(MCR,ChannelA,0x04);
fWriteOneByteToRegister(FCR,ChannelA,0x06); //enable ,reset FIFO
fWriteOneByteToRegister(FCR,ChannelA,0xB7); //enable FIFO 56
fWriteOneByteToRegister(TLR,ChannelA,0x00);
fWriteOneByteToRegister(LCR,ChannelA,0x83);
fWriteOneByteToRegister(DLL,ChannelA,0x18); //19200bps
fWriteOneByteToRegister(DLH,ChannelA,0x00); //SetBaudrate
fWriteOneByteToRegister(LCR,ChannelA,0x03); //can't sleep mode
fWriteOneByteToRegister(IER,ChannelA,0x00);
}
void fClearSC16IS752BUF(void) //I2C中的数据清除掉
{
WriteRegister(LCR,ChannelA,0xBF); //Enter enhance mode
WriteRegister(EFR,ChannelA,0xD0); //1101 0000,Auto CTS,Auto RTS ,enable mode
WriteRegister(LCR,ChannelA,0x03); //8 bit,no parity,1 stop bits
WriteRegister(MCR,ChannelA,0x04);
WriteRegister(FCR,ChannelA,0x06); //enable ,reset FIFO
WriteRegister(FCR,ChannelA,0xB7); //enable FIFO 56
WriteRegister(TLR,ChannelA,0x00);
// WriteRegister(LCR,ChannelA,0x03); //can't sleep mode
// WriteRegister(IER,ChannelA,0x01); //开启RHR中断
}
void main(void)
{
unsigned char rReceiveData,MidData,rRcvAdd,aCollectI2CData[100];
unsigned char rLength,aTransmitI2CData[10]=[0,1,2,3,4,5,6,7,8,9];
fInitialSC16IS752();
fClearSC16IS752BU();
while(1)
{
//读I2C数据
MidData =ReadRegister(LSR,ChannelA); //至少有一个字符
MidData = MidData&0x01;
if(MidData==I2C_NEW_DATA) //有字符
{
rReceiveData = ReadRegister(RHR,ChannelA); //读字符
aCollectI2CData[rRcvAdd] = rReceiveData;
rRcvAdd++;
}
//向I2C发送一串数据
MidData = ReadRegister(LSR,ChannelA); //发送
MidData = MidData&0x20;
rLength= 10;
if((MidData==I2C_NO_DATA)
{
WriteData(THR,ChannelA,aTransmitToRemote,rLength)
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -