#include #include #define _nop_() udelay(1); #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} #define bit bool void iic_start(void); void iic_stop(void); void iic_ack(bit ackbit); void iic_sendbyte(unsigned char byt); void wrbyte_24c02(unsigned char add,unsigned char dat); void delay(unsigned char t); bit iic_waitack(void); unsigned char i2c_recbyte(void); unsigned char rdbyte_24c02(unsigned char add); unsigned char wrEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak); unsigned char rdEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak); void SDAOut(bit c) { // sdrv_pinctrl_set_input_select(GPIO_Y3, PIN_IS_CMOS); // sdrv_gpio_set_pin_direction(GPIO_Y3, GPIO_DIR_OUT); sdrv_gpio_set_pin_output_level(GPIO_Y3, c); } void SCLOut(bit c) { sdrv_gpio_set_pin_output_level(GPIO_Y2, c); } void iic_start(void) { SDAOut(1); _nop_(); SCLOut(1); somenop; SDAOut(0); somenop; SCLOut(0); } void iic_stop(void) { SDAOut(0); _nop_(); SCLOut(1); somenop; SDAOut(1); } void iic_ack(bit ackbit) { if(ackbit) SDAOut(0); else SDAOut(1); somenop; SCLOut(1); somenop; SCLOut(0); SDAOut(1); somenop; } bit iic_waitack(void) { SDAOut(1); somenop; SCLOut(1); // sdrv_pinctrl_set_input_select(GPIO_Y3, PIN_IS_CMOS_SCHMITT); // sdrv_gpio_set_pin_direction(GPIO_Y3, GPIO_DIR_IN); somenop; if(sdrv_gpio_read_pin_input_level(GPIO_Y3)) { SCLOut(0); iic_stop(); return 0; } else { SCLOut(0); return 1; } } void iic_sendbyte(unsigned char byt) { unsigned char i; for(i=0;i<8;i++) { if(byt&0x80) SDAOut(1); else SDAOut(0); somenop; SCLOut(1); byt <<= 1; somenop; SCLOut(0); } } unsigned char iic_recbyte(void) { unsigned char da; unsigned char i; for(i=0;i<8;i++) { SCLOut(1); // sdrv_pinctrl_set_input_select(GPIO_Y3, PIN_IS_CMOS_SCHMITT); // sdrv_gpio_set_pin_direction(GPIO_Y3, GPIO_DIR_IN); somenop; da <<= 1; // P1_IOCR01 = 0x0020; // load port control register 1 if(sdrv_gpio_read_pin_input_level(GPIO_Y3)) da |= 0x01; SCLOut(0); somenop; } return da; } void wrbyte_24c02(unsigned char add,unsigned char dat) { // Device Address 1100 000 R/W iic_start(); iic_sendbyte(0xa0); iic_waitack(); iic_sendbyte(add); iic_waitack(); iic_sendbyte(dat); iic_waitack(); iic_stop(); // delay(10); //20180312更换E2后,时间需要修改 2ms就可以正常工作,保险起见设置3ms 20190122注销通过外部状态机实现延时。 //CAN_sendAck(add, dat); } unsigned char rdbyte_24c02(unsigned char add) { // Device Address 1100 000 R/W unsigned char da; iic_start(); iic_sendbyte(0xa0); iic_waitack(); iic_sendbyte(add); iic_waitack(); iic_start(); iic_sendbyte(0xa1); iic_waitack(); da = iic_recbyte(); iic_ack(0); iic_stop(); //CAN_sendAck(add, da); return da; } void delay(unsigned char t) { unsigned int i; while(t--) { for(i=0;i<13333;i++)WDT_vServiceWDT(); //20180312更换E2后,时间需要修改 } } #ifdef _EEROM_CRC_ #define POLY 0x1021 /** * Calculating CRC-16 in 'C' * @para addr, start of data * @para num, length of data * @para crc, incoming CRC */ unsigned int crc16(unsigned char *addr, int num, unsigned int crc) { int i; for (; num > 0; num--) /* Step through bytes in memory */ { crc = crc ^ ((*addr) << 8); /* Fetch byte from memory, XOR into CRC top byte*/ addr++; for (i = 0; i < 8; i++) /* Prepare to rotate 8 bits */ { if (crc & 0x8000) /* b15 is set... */ crc = (crc << 1) ^ POLY; /* rotate and XOR with polynomic */ else /* b15 is clear... */ crc <<= 1; /* just rotate */ } /* Loop for 8 bits */ crc &= 0xFFFF; /* Ensure CRC remains 16-bit value */ } /* Loop until num=0 */ return(crc); /* Return updated CRC */ } //写入正确会自动写一个备份,写入有问题就不会写备份 unsigned char wrEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak) { uword crc_Res; unsigned char index; unsigned char flagEEwrOK; crc_Res = crc16(eeData, len-2, 0xffff); //计算数据的校验 eeData[len-2] = (ubyte)(crc_Res ); eeData[len-1] = (ubyte)(crc_Res >> 8); for(index=0;index