📄 uarti2c.c
字号:
while(i2c_sda==1) // 等待ACK信号来临
{
i++;
if(i>100)
{
watchdog();
ack = 0;
BP_DIR = 1;
sendtoPC(temp,2);
BP_DIR = 0;
break;
}
}
i2c_scl = 0;
//DelayIIC(3);
//ack=1;
// if((IO0PIN & SDA)==SDA)
//ack=0;
//else ack=1;
//IO0DIR = (SDA|SCL);
//--- IO0DIR = IO0DIR|(SDA|SCL); //将端口再次置为输出
//i2c_scl = 0;
//i2c_sda = 0;//<1
DelayIIC(3);
// IO0DIR = IO0DIR|(SDA|SCL);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
//IO0DIR = IO0DIR|SCL;
//IO0DIR = IO0DIR&(~SDA);
for(BitCnt=0;BitCnt<8;BitCnt++)
{
//DelayIIC(3);
i2c_scl = 0; /*置时钟线为低,准备接收数据位*/
DelayIIC(3);
i2c_scl = 1;; /*置时钟线为高使数据线上数据有效*/
DelayIIC(3);
retc=retc<<1;
if(i2c_sda==1)
retc=retc+1; /*读数据位,接收的数据位放入retc中 */
//DelayIIC(3);
}
i2c_scl = 0;
//Ack_I2c(0);
// IO0DIR=SCL;
DelayIIC(3);
// IO0DIR = IO0DIR|(SDA|SCL);
return(retc);
}
uchar ISendStrOneAddr(uchar sla, uchar suba, uchar *s, uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
I2CSendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
I2CSendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
I2CSendByte(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
uchar IRcvStrOneAddr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
I2CSendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
I2CSendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c();
I2CSendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
//---------------------------------------------------------------
//协议格式:
//0x2a+0x52+'ID' + 'SUB'+'NUMBER'+0X0D
//* + W + ID + SUB + NUMBER + DATA1 +..DATAN +0X0D
uchar CommandActive()
{
uchar temp[2]={'A','C'};
if(CommandBuf[1]!=0x52 && CommandBuf[1]!=0x57)
{
temp[0]='A';
temp[1]='O';
BP_DIR = 1;
sendtoPC(temp,2);
BP_DIR = 0;
return 0;
}
else if(CommandBuf[1]==0x52)
{
if(CommandBuf[5]!=0x0d)
{
//CommandBufPoint = 0;
temp[0]='A';
temp[1]='A';
BP_DIR = 1;
sendtoPC(temp,2);
BP_DIR = 0;
sendRQ=0;
return 0;
}
}
else if(CommandBuf[1]==0x57)
{
if(CommandBuf[5+CommandBuf[4]]!=0x0d)
{
temp[0]='A';
temp[1]='B';
BP_DIR = 1;
sendtoPC(temp,2);
BP_DIR = 0;
sendRQ=0;
//CommandBufPoint = 0;
return 0;
}
}
if(CommandBuf[0]!=0x2a)
{
CommandBufPoint = 0;
temp[0]='A';
temp[1]='C';
BP_DIR = 1;
sendtoPC(temp,2);
BP_DIR = 0;
sendRQ=0;
return 0;
}
else
{
CommandBuf[0] = 0;
CommandBufPoint = 0;
sendRQ = 1;
temp[0]='A';
temp[1]='D';
BP_DIR = 1;
sendtoPC(temp,2);
BP_DIR = 0;
return 1;
}
}
uchar CommandAnalyse()
{
uchar temp[10],i;
for(i=0;i<10;i++)
{
temp[i] = 0;
}
if(CommandBuf[1]==0x52)
{
for(i=0;i<CommandBuf[4];i++)
{
IRcvStrOneAddr(CommandBuf[2],CommandBuf[3]+i,&temp[i],1);
}
//IRcvStrOneAddr(CommandBuf[2],CommandBuf[3],temp,CommandBuf[4]);
//for(i=0;i<CommandBuf[4];i++)
//{
BP_DIR = 1;
sendtoPC(&temp,CommandBuf[4]);
BP_DIR = 0;
//}
}
else if(CommandBuf[1]==0x57)
{
for(i=0;i<CommandBuf[4];i++)
{
temp[i] = CommandBuf[5+i];
ISendStrOneAddr(CommandBuf[2], CommandBuf[3]+i, &temp[i], 1);
}
// ISendStrOneAddr(CommandBuf[2], CommandBuf[3], temp, CommandBuf[4]);
}
return 1;
}
/****************************************************
主函数
*******************************************************/
uchar uartbuf;
void main()
{
uchar temp[10],count,i;
WATCHDOG_init();
IO_init();
UART_init();
DATA_init();
// readaddress();
CommandBufPoint=0;
currentrecv=0;
sendRQ=0;
// MAX7456CS=0;
// Max7456Init();
//FLASH_ReadNum();
//FLASH_ReadSaveInfo();
// MAX7456CS=1;
delay();
BP_DIR = 0;
count = 0;
for(i=0;i<10;i++)
{
temp[i] = i;
}
BP_DIR = 1;
sendtoPC(&temp,10);
BP_DIR = 0;
while(1)
{
watchdog();
act = ~act;
if (sendRQ)
{
CommandActive();
}
if(sendRQ)
{
CommandAnalyse();
sendRQ = 0;
for(i=0;i<20;i++)
{
CommandBuf[i] = 0;
}
}
watchdog();
//if(sendRQ==1)
//{
//count++;
//ISendStrOneAddr(0x98, 0x01,&count,1);
//_nop_();
//_nop_();
//IRcvStrOneAddr(0x98,0x00,temp,5);
//BP_DIR = 1;
//sendtoPC(&temp,5);
//BP_DIR = 0;
//delay();
//sendRQ = 0;
//BP_DIR = 1;
//sendtoPC(&uartbuf,1);
//BP_DIR = 0;
//sendRQ=0;
}
}
void UART_ISR() interrupt 4
{
if(RI==1)
{
RI = 0;//
//sendRQ = 1;
CommandBuf[CommandBufPoint]=SBUF;
if(CommandBuf[CommandBufPoint]==0x0d)
{
sendRQ = 1;
CommandBufPoint++;
}
if(CommandBufPoint==0 && CommandBuf[0]!=0x2a)
{
CommandBufPoint = 0;
}
else
{
CommandBufPoint++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -