285 lines
6.3 KiB
C
285 lines
6.3 KiB
C
#include <sdrv_gpio.h>
|
||
#include <udelay/udelay.h>
|
||
|
||
#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<31><32><EFBFBD><EFBFBD>E2<45><32><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD> 2ms<6D>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3ms 20190122ע<32><D7A2>ͨ<EFBFBD><CDA8><EFBFBD>ⲿ״̬<D7B4><CCAC>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||
//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<31><32><EFBFBD><EFBFBD>E2<45><32><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>
|
||
}
|
||
}
|
||
|
||
|
||
#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 */
|
||
}
|
||
|
||
//д<><D0B4><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Զ<EFBFBD>дһ<D0B4><D2BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||
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); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>У<EFBFBD><D0A3>
|
||
eeData[len-2] = (ubyte)(crc_Res );
|
||
eeData[len-1] = (ubyte)(crc_Res >> 8);
|
||
|
||
for(index=0;index<len;index++) //д<><D0B4><EFBFBD><EFBFBD>
|
||
{WDT_vServiceWDT();
|
||
wrbyte_24c02( add + index, eeData[index]);
|
||
}
|
||
flagEEwrOK = 1;
|
||
|
||
for(index=0;index<len;index++) //У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{WDT_vServiceWDT();
|
||
if(rdbyte_24c02( add + index) != eeData[index])
|
||
{
|
||
flagEEwrOK = 0;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(1 == flagEEwrOK) //
|
||
{
|
||
for(index=0;index<len;index++) //д<><D0B4><EFBFBD>ݺ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{WDT_vServiceWDT();
|
||
wrbyte_24c02( addbak + index, eeData[index]);
|
||
}
|
||
flagEEwrOK = 2;
|
||
for(index=0;index<len;index++)
|
||
{WDT_vServiceWDT();
|
||
if(rdbyte_24c02( addbak + index) != eeData[index])
|
||
{ flagEEwrOK = 0;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
flagEEwrOK = 0;
|
||
//.........
|
||
}
|
||
return flagEEwrOK;
|
||
}
|
||
unsigned char rdEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak)
|
||
{
|
||
uword crc_Res;
|
||
unsigned char index;
|
||
unsigned char reEEok = 0;
|
||
|
||
for(index=0;index<len;index++) //<2F><><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{WDT_vServiceWDT();
|
||
eeData[index] = rdbyte_24c02(add + index);
|
||
}
|
||
crc_Res = crc16(eeData, len-2, 0xffff); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>У<EFBFBD><D0A3>
|
||
if( crc_Res == ((uword)eeData[len-1] << 8) + (uword)eeData[len-2]) //<2F>Աȶ<D4B1>ȡ<EFBFBD><C8A1>У<EFBFBD><D0A3>ֵ <20><>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>EEֵ<45><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ...
|
||
{
|
||
reEEok = 1;
|
||
}
|
||
else
|
||
{
|
||
for(index=0;index<len;index++) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{WDT_vServiceWDT();
|
||
eeData[index] = rdbyte_24c02(addbak + index);
|
||
}
|
||
crc_Res = crc16(eeData, len-2, 0xffff); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>У<EFBFBD><D0A3>
|
||
if( crc_Res == ((uword)eeData[len-1] << 8) + (uword)eeData[len-2]) //<2F>Աȶ<D4B1>ȡ<EFBFBD><C8A1>У<EFBFBD><D0A3>ֵ <20><>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>EEֵ<45><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ...
|
||
{
|
||
reEEok = 2;
|
||
}
|
||
else
|
||
{
|
||
reEEok = 0;
|
||
}
|
||
}
|
||
return reEEok;
|
||
}
|
||
|
||
#endif
|
||
|