⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sc16is75xok.c

📁 对 一款 SC16IS75X I2C转串口芯片 读写操作 及其应用
💻 C
字号:
#include "SM8958A.H"
#include "RC2811IO.h"
#include "sc16is752.h"

#define	DELAYTIME	20

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)
{
//unsigned char buf1;
    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);
  

   // buf = ReadRegister(LCR,ChannelA);
  //  buf1 = ReadRegister(FCR,ChannelA);
	

   
  //  WriteRegister(LCR,ChannelA,0x03);   //sleep mode
   // WriteRegister(IER,ChannelA,0x10);
//	buf = ReadRegister(FCR,ChannelA);
//	buf1 = ReadRegister(LCR,ChannelA);

    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);
 
 //   buf = ReadRegister(DLL,ChannelA);
//	buf1 = ReadRegister(DLH,ChannelA);
//fWriteOneByteToRegister(LCR,ChannelA,0x55);
//buf1 = fReadRegister(LCR,ChannelA);
}
/*
void fInitialSC16IS752(void)
{
	unsigned char	MidData;

    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);	//enable TLR IER is accessible

    fWriteOneByteToRegister(IER,ChannelA,0x00);
	fWriteOneByteToRegister(TLR,ChannelA,0x00);	//enable FIFO ,disable RX/TX

	fWriteOneByteToRegister(FCR,ChannelA,0xB7);	//enable  FIFO 56,and Reset FIFO

    fWriteOneByteToRegister(LCR,ChannelA,0x83);	//enable special Register is accessible
    fWriteOneByteToRegister(DLL,ChannelA,0x30);	//9600bps
    fWriteOneByteToRegister(DLH,ChannelA,0x00); //SetBaudrate

//Test

    fWriteOneByteToRegister(LCR,ChannelA,0x83);	//Enter enhance mode
    fWriteOneByteToRegister(DLL,ChannelA,0x0f);
    MidData=fReadRegister(DLL,ChannelA);
    MidData=fReadRegister(LCR,ChannelA);

}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -