| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #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);
-
- }
|