#include "includes.h" unsigned char LastRxbuffer[13]; /********************************************************************************** 写入数据 in :chip Num 接入IC个数 **********************************************************************************/ void Write_74HC595(unsigned char ChipNum,unsigned char *DataBuf) { unsigned char i = 0; unsigned char DataBufTmp = 0; GPIO_ResetBits(HC595_RCK_PORT,HC595_RCK_PIN); //设置LCK 为低电平,上升沿数据锁存 for(; ChipNum>0; ChipNum--) { DataBufTmp = *DataBuf;//0x88 DataBufTmp=DataBufTmp | 0x11;//////////////////////////// for(i=0; i<8; i++) { GPIO_ResetBits(HC595_SCK_PORT, HC595_SCK_PIN); //时钟低电平 if (DataBufTmp & 0x80) { GPIO_SetBits(HC595_DATA_PORT, HC595_DATA_PIN); //输出1 } else { GPIO_ResetBits(HC595_DATA_PORT, HC595_DATA_PIN); //输出0 } //HC595_delay(5); DelayMS(1); GPIO_SetBits(HC595_SCK_PORT, HC595_SCK_PIN); //时钟高电平,上升沿数据移位 //HC595_delay(5); DelayMS(1); DataBufTmp = DataBufTmp << 1; } DataBuf++; } GPIO_SetBits(HC595_RCK_PORT, HC595_RCK_PIN); //设置LCK 为高电平,上升沿数据锁存 //HC595_delay(10); DelayMS(2); GPIO_ResetBits(HC595_RCK_PORT, HC595_RCK_PIN ); // } /******************************************************************************** 并行数据读取,这里主要用于读取红外的状态 //CE始终接地 //PL 拉低 放入锁存器 //CP为高 上升沿移位 ********************************************************************************/ unsigned char Read_74HC165(void) { unsigned char i; unsigned char RetDat=0x00; //Dev74HC165_CP = 1; HC165_CP_HIGH; //Dev74HC165_PL = 0; HC165_PL_LOW; DelayMS(1); //Dev74HC165_PL = 1; HC165_PL_HIGH; DelayMS(3); if(HC165_DATA_READ == 1) RetDat = 0x01; for(i = 0; i < 7; i++) { RetDat <<= 1; //Dev74HC165_CP = 0; HC165_CP_LOW; DelayMS(1); //Dev74HC165_CP = 1; HC165_CP_HIGH; DelayMS(1); if(HC165_DATA_READ == 1) //读取Q7脚 { RetDat |= 0x01; } } //Dev74HC165_CP = 0; HC165_CP_LOW; return RetDat; } /*************************************************************************** 格式 查询 0xaa 0xbb cmd len(1) 故障码(1) addr(1) data(1) crc(2) DD 55// LEN=11 ***************************************************************************/ void QueryRecvProcess(unsigned char *rxbuffer) { unsigned char data,i; unsigned short crc,CRC16; unsigned char Pack[11]; unsigned char readbuf[4]={0x80,0x80,0x80,0x80}; //0x11 int len=rxbuffer[3]; //先判断是否是本机及长度校验。 可在外层先判断是否是本机 CRC16=crc16_calc(0xffff,rxbuffer,len-4); crc=((unsigned short)rxbuffer[len-3]&0xff)<<8; crc+=(unsigned short)rxbuffer[len-4]&0xff; if(rxbuffer[4]!=sutProductPara.Addr){ SlwTrace(INF,"addr erro",1); return ; } if(crc != CRC16 ) { SlwTrace(INF,"CRC erro",1); //CRC校验不对,不处理 return ; } if(rxbuffer[2]!=HOLDINGREG){ SlwTrace(INF,"cmd error",1); return; } //Write_74HC595(4,readbuf); //红外全程打开 data=Read_74HC165(); //塞包 入数据 Pack[0]=0xAA; Pack[1]=0xBB; Pack[2]=HOLDINGREG; Pack[3]=0x0B; Pack[4]=sutProductPara.Addr;//从机地址 Pack[5]=0xEE; //故障码 Pack[6]=data;//红外状态 CRC16=crc16_calc(0xffff,Pack,7); Pack[7] = (unsigned char)(CRC16 & 0xff); Pack[8] = (unsigned char)(CRC16 >> 8); Pack[9]=0xDD; Pack[10]=0x55; RS485_DIR_HIGH; for(i=0;i<11;i++) { USART_SendData(USART1,Pack[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } RS485_DIR_LOW; } /************************************************************** 格式 0xcc 0xdd cmd len(1) addr(1) data(4) crc(2) DD 55// LEN=13 **************************************************************/ void SetRecvProcess(unsigned char *rxbuffer) { unsigned char i; unsigned char *pData=rxbuffer; unsigned char writebuf[4]={0}; unsigned short crc,CRC16; int len=rxbuffer[3]; char buf[30]; SlwTrace(INF,rxbuffer,1); //if(0==memcmp(LastRxbuffer,rxbuffer,sizeof(LastRxbuffer)) return; if(0==memcmp(LastRxbuffer,rxbuffer,13)) return; memcpy(LastRxbuffer,rxbuffer,13); // CRC16=crc16_calc(0xffff,rxbuffer,9); // rxbuffer[9] = (unsigned char)(CRC16 & 0xff); // rxbuffer[10] = (unsigned char)(CRC16 >> 8); //判断CRC CRC16=crc16_calc(0xffff,rxbuffer,len-4); crc=((unsigned short)rxbuffer[len-3]&0xff)<<8; crc+=(unsigned short)rxbuffer[len-4]&0xff; if(crc != CRC16 || rxbuffer[4]!=sutProductPara.Addr){ SlwTrace(INF,"crc or addrerro\r\n",1); return ;//CRC校验不对,不处理 } if(rxbuffer[2]!=WRITESINGLEREG) { SlwTrace(INF,"cmd erro\r\n",1); return; } //设置灯状态 SlwTrace(INF,"set led ",1); for(i=0;i<4;i++) writebuf[i]=pData[i+5]; snprintf(buf,sizeof(buf),"%02x..%02x..%02x..%02x",writebuf[0],writebuf[1],writebuf[2],writebuf[3]); SlwTrace(INF,buf,1); Write_74HC595(4,writebuf); }