905 lines
17 KiB
C
905 lines
17 KiB
C
|
|
|
|||
|
|
//=========================== <20><><EFBFBD><EFBFBD>оƬ SMEC98SP <20>ӿ<EFBFBD> ===========================//
|
|||
|
|
#include "smec98sp.h"
|
|||
|
|
|
|||
|
|
#ifdef SMEC_CHIP
|
|||
|
|
|
|||
|
|
#include <string.h>
|
|||
|
|
#include "afxdef.h"
|
|||
|
|
#include "stm32f4xx_ll_gpio.h"
|
|||
|
|
|
|||
|
|
//SMEC98SP IIC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F>ģ<EFBFBD><C4A3>IICЭ<43><D0AD>
|
|||
|
|
#define IIC_NOACK TRUE
|
|||
|
|
#define IIC_ACK FALSE
|
|||
|
|
#define HIGHT TRUE
|
|||
|
|
#define LOW FALSE
|
|||
|
|
|
|||
|
|
#define IIC_DELAYTIME 24 //bitλ<74><CEBB>ʱ(ʵ<><CAB5><EFBFBD><EFBFBD>С22,<2C><><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>ͨѶ)
|
|||
|
|
#define ACKCHECKTIME 2000 //<2F>ȴ<EFBFBD>ACK<43><4B>ʱʱ<CAB1><CAB1>
|
|||
|
|
#define IIC_START_TIMES 500 //<2F><><EFBFBD>ͣ<EFBFBD>START<52>ź<EFBFBD>+<2B><>ַ<EFBFBD>ֽڣ<D6BD> <20>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
|
|||
|
|
//=========================== <20><>SMEC98SPͨѶ<CDA8>ĹܽŶ<DCBD><C5B6><EFBFBD> ===========================//
|
|||
|
|
#define IIC_SCL_Pin LL_GPIO_PIN_8
|
|||
|
|
#define IIC_SCL_GPIO_Port GPIOA
|
|||
|
|
#define IIC_SCL_GPIO_Clock LL_AHB1_GRP1_PERIPH_GPIOA
|
|||
|
|
|
|||
|
|
#define IIC_SDA_Pin LL_GPIO_PIN_9
|
|||
|
|
#define IIC_SDA_GPIO_Port GPIOC
|
|||
|
|
#define IIC_SDA_GPIO_Clock LL_AHB1_GRP1_PERIPH_GPIOC
|
|||
|
|
|
|||
|
|
//=========================== I2CͨѶ<CDA8><D1B6><EFBFBD><EFBFBD> ===========================//
|
|||
|
|
#if (1)
|
|||
|
|
|
|||
|
|
int initedFlag = 0; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־
|
|||
|
|
#define IIC_ADDR 0x00 //<2F><>ӦSMEC98SP<53>е<EFBFBD>ַ
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˿ڻ<CBBF><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
void SMEC_I2cInit(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|||
|
|
|
|||
|
|
LL_GPIO_SetOutputPin(IIC_SCL_GPIO_Port, IIC_SCL_Pin);
|
|||
|
|
LL_GPIO_SetOutputPin(IIC_SDA_GPIO_Port, IIC_SDA_Pin);
|
|||
|
|
|
|||
|
|
GPIO_InitStruct.Pin = IIC_SCL_Pin;
|
|||
|
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
|
|||
|
|
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
|||
|
|
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
|||
|
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
|
|||
|
|
LL_GPIO_Init(IIC_SCL_GPIO_Port, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
GPIO_InitStruct.Pin = IIC_SDA_Pin;
|
|||
|
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
|
|||
|
|
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
|||
|
|
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
|
|||
|
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
|
|||
|
|
LL_GPIO_Init(IIC_SDA_GPIO_Port, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
// GPIO_InitTypeDef GPIO_InitStructure;
|
|||
|
|
// GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
|
|||
|
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_Speed_2MHz;
|
|||
|
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
|
|||
|
|
// GPIO_Init(IIC_PORT, &GPIO_InitStructure);
|
|||
|
|
|
|||
|
|
// GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;
|
|||
|
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_Speed_2MHz;
|
|||
|
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_Out_OD;//GPIO_Mode_Out_PP;
|
|||
|
|
// GPIO_Init(IIC_PORT, &GPIO_InitStructure);
|
|||
|
|
|
|||
|
|
initedFlag = 0x5a5a; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
void SdaInputMode(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|||
|
|
|
|||
|
|
GPIO_InitStruct.Pin = IIC_SDA_Pin;
|
|||
|
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
|
|||
|
|
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
|||
|
|
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
|
|||
|
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
|
|||
|
|
LL_GPIO_Init(IIC_SDA_GPIO_Port, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
// GPIO_InitTypeDef GPIO_InitStructure;
|
|||
|
|
// GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
|
|||
|
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_Speed_2MHz;
|
|||
|
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
|||
|
|
// GPIO_Init(IIC_PORT, &GPIO_InitStructure);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
void SdaOutputMode(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|||
|
|
|
|||
|
|
GPIO_InitStruct.Pin = IIC_SDA_Pin;
|
|||
|
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
|
|||
|
|
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
|||
|
|
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
|||
|
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
|
|||
|
|
LL_GPIO_Init(IIC_SDA_GPIO_Port, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
// GPIO_InitTypeDef GPIO_InitStructure;
|
|||
|
|
// GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
|
|||
|
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_Speed_2MHz;
|
|||
|
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|||
|
|
// GPIO_Init(IIC_PORT, &GPIO_InitStructure);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void IIC_Delay(unsigned int times)
|
|||
|
|
{
|
|||
|
|
u16 loop;
|
|||
|
|
for(loop=0;loop<times;loop++)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//ʱ<><CAB1><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
|
|||
|
|
void IIC_SetSclPin(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_SetOutputPin(IIC_SCL_GPIO_Port, IIC_SCL_Pin);
|
|||
|
|
//GPIO_WriteBit(IIC_PORT,IIC_SCL_PIN,Bit_SET);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ʱ<><CAB1><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ
|
|||
|
|
void IIC_ClrSclPin(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_ResetOutputPin(IIC_SCL_GPIO_Port, IIC_SCL_Pin);
|
|||
|
|
//GPIO_WriteBit(IIC_PORT,IIC_SCL_PIN,Bit_RESET);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
|
|||
|
|
void IIC_SetSdaPin(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_SetOutputPin(IIC_SDA_GPIO_Port, IIC_SDA_Pin);
|
|||
|
|
//GPIO_WriteBit(IIC_PORT,IIC_SDA_PIN,Bit_SET);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ
|
|||
|
|
void IIC_ClrSdaPin(void)
|
|||
|
|
{
|
|||
|
|
LL_GPIO_ResetOutputPin(IIC_SDA_GPIO_Port, IIC_SDA_Pin);
|
|||
|
|
//GPIO_WriteBit(IIC_PORT,IIC_SDA_PIN,Bit_RESET);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u32 IIC_GetSdaStus(void)
|
|||
|
|
{
|
|||
|
|
return LL_GPIO_IsInputPinSet(IIC_SDA_GPIO_Port, IIC_SDA_Pin);
|
|||
|
|
|
|||
|
|
//return (bool)(GPIO_ReadInputDataBit(IIC_PORT,IIC_SDA_PIN));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ʱ<><CAB1><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>HLow
|
|||
|
|
void IIC_SetScl(_Bool HLow)
|
|||
|
|
{
|
|||
|
|
HLow?IIC_SetSclPin():IIC_ClrSclPin();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>HLow
|
|||
|
|
void IIC_SetSda(_Bool HLow)
|
|||
|
|
{
|
|||
|
|
HLow?IIC_SetSdaPin():IIC_ClrSdaPin();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>i2c<32><63>ʼ<EFBFBD>źŲ<C5BA><C5B2><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// void
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// void
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
void IIC_Start(void)
|
|||
|
|
{
|
|||
|
|
SdaOutputMode();
|
|||
|
|
|
|||
|
|
IIC_SetSda(HIGHT);
|
|||
|
|
IIC_SetScl(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetSda(LOW);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>i2cֹͣ<CDA3>źŲ<C5BA><C5B2><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// void
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// void
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
void IIC_Stop(void)
|
|||
|
|
{
|
|||
|
|
SdaOutputMode();
|
|||
|
|
|
|||
|
|
IIC_SetSda(LOW);
|
|||
|
|
IIC_SetScl(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetSda(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: i2c<32><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// ucVal : <20>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
_Bool IIC_Send(u8 ucVal)
|
|||
|
|
{
|
|||
|
|
_Bool Ack;
|
|||
|
|
u16 AckLoop;
|
|||
|
|
u8 i;
|
|||
|
|
|
|||
|
|
SdaOutputMode();
|
|||
|
|
|
|||
|
|
for(i=0;i<8;i++)
|
|||
|
|
{
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetSda((ucVal & 0x80)?TRUE:FALSE);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetScl(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
ucVal<<= 1;
|
|||
|
|
}
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
SdaInputMode();
|
|||
|
|
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetScl(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
Ack = IIC_NOACK;
|
|||
|
|
|
|||
|
|
for(AckLoop=0;AckLoop<ACKCHECKTIME;AckLoop++) //260us
|
|||
|
|
{
|
|||
|
|
if(IIC_GetSdaStus() == 0)
|
|||
|
|
{
|
|||
|
|
Ack = IIC_ACK;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
}
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
return Ack; //return success=0 / failure=1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: i2c<32><63>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// bACK - <20><>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ɺ<EFBFBD>, <20><><EFBFBD><EFBFBD>SDA״ֵ̬
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// <09><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 IIC_Read(_Bool bACK)
|
|||
|
|
{
|
|||
|
|
u8 Data;
|
|||
|
|
u8 i;
|
|||
|
|
|
|||
|
|
SdaInputMode();
|
|||
|
|
|
|||
|
|
Data = 0;
|
|||
|
|
for(i=0;i<8;i++)
|
|||
|
|
{
|
|||
|
|
Data <<= 1;
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetScl(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
if(IIC_GetSdaStus() != 0)
|
|||
|
|
{
|
|||
|
|
Data |= 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Data &= 0xfe;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
SdaOutputMode();
|
|||
|
|
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetSda(bACK);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetScl(HIGHT);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_SetScl(LOW);
|
|||
|
|
return Data;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// addr - I2C<32><43>ַ
|
|||
|
|
// buf - Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
// len - <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// <09><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
_Bool IIC_ReadWithAddr(u8 addr, u8 *buf, u8 len)
|
|||
|
|
{
|
|||
|
|
unsigned int i;
|
|||
|
|
i = IIC_START_TIMES;
|
|||
|
|
|
|||
|
|
if (initedFlag != 0x5a5a)
|
|||
|
|
{
|
|||
|
|
SMEC_I2cInit(); // <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
while (i)
|
|||
|
|
{
|
|||
|
|
IIC_Start();
|
|||
|
|
if (IIC_Send(addr) == IIC_ACK)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (--i == 0)
|
|||
|
|
{
|
|||
|
|
return IIC_NOACK;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for(i = 0; i < len -1 ; i++)
|
|||
|
|
{
|
|||
|
|
buf[i] = IIC_Read(IIC_ACK);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
buf[i] = IIC_Read(IIC_NOACK);
|
|||
|
|
|
|||
|
|
IIC_Stop();
|
|||
|
|
|
|||
|
|
return IIC_ACK;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: д<><D0B4>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// addr - I2C<32><43>ַ
|
|||
|
|
// buf - Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
// len - <20><>д<EFBFBD>볤<EFBFBD><EBB3A4>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// <09><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
_Bool IIC_WriteWithAddr(u8 addr, u8 *buf, u8 len)
|
|||
|
|
{
|
|||
|
|
unsigned int i;
|
|||
|
|
i = IIC_START_TIMES;
|
|||
|
|
|
|||
|
|
if (initedFlag != 0x5a5a)
|
|||
|
|
{
|
|||
|
|
SMEC_I2cInit(); // <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
while (i)
|
|||
|
|
{
|
|||
|
|
IIC_Start();
|
|||
|
|
if (IIC_Send(addr) == IIC_ACK)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (--i == 0)
|
|||
|
|
{
|
|||
|
|
return IIC_NOACK;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for(i = 0; i < len; i++)
|
|||
|
|
{
|
|||
|
|
if(IIC_Send(buf[i]))
|
|||
|
|
{
|
|||
|
|
return IIC_NOACK;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
IIC_Delay(IIC_DELAYTIME);
|
|||
|
|
|
|||
|
|
IIC_Stop();
|
|||
|
|
|
|||
|
|
return IIC_ACK;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֵΪ0ʱ,<2C><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>汾<EFBFBD><E6B1BE>ʧ<EFBFBD><CAA7>.
|
|||
|
|
u16 SMEC_GetVer(void)
|
|||
|
|
{
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u16 ver = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x00; //<2F><><EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bBuf[1] = 0x00;
|
|||
|
|
bBuf[2] = 0x00;
|
|||
|
|
bBuf[3] = 0x00;
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, 4);
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, 2);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
ver = (bBuf[0]<<8)|(bBuf[1]);
|
|||
|
|
}
|
|||
|
|
return ver;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>оƬSMEC98SP<53><50>UID
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// pUID - UID<49><44><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
#define UID_LEN 0x0C
|
|||
|
|
|
|||
|
|
u8 SMEC_GetUid(u8 * pUID)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
u8 cnt0 = 0;
|
|||
|
|
u8 cnt255 = 0;
|
|||
|
|
|
|||
|
|
if (pUID == NULL)
|
|||
|
|
{
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x01; //<2F><>UID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bBuf[1] = 0x00;
|
|||
|
|
bBuf[2] = 0x00;
|
|||
|
|
bBuf[3] = 0x00;
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, 4);
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, (UID_LEN + 2));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<(UID_LEN+2);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (i = 2;i<(UID_LEN + 2);i++)
|
|||
|
|
{
|
|||
|
|
if (bBuf[i] == 0)
|
|||
|
|
{
|
|||
|
|
cnt0++;
|
|||
|
|
}
|
|||
|
|
if (bBuf[i] == 0xFF)
|
|||
|
|
{
|
|||
|
|
cnt255++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((rst == 0) &&
|
|||
|
|
(bBuf[0] == 0x81) && // 0x81 <20><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>ȷ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|||
|
|
(sum == 0) && // <20><>У<EFBFBD><D0A3>
|
|||
|
|
(cnt0 != 12) && // ȫ0
|
|||
|
|
(cnt255 != 12) && // ȫFF
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
memcpy(pUID, bBuf + 2, UID_LEN);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rst = 1;
|
|||
|
|
}
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>оƬSMEC98SP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// pRandom - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 SMEC_GetRandom(u8 *pRandom, u8 bLen)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
if ((pRandom == NULL) || (bLen > 124) || (bLen == 0))
|
|||
|
|
{
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x02;
|
|||
|
|
bBuf[1] = 0x00;
|
|||
|
|
bBuf[2] = 0x00;
|
|||
|
|
bBuf[3] = bLen ;
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, 4);
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, (bLen+2));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<(bLen+2);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((rst == 0) &&
|
|||
|
|
(bBuf[0] == 0x82) && // 0x82 <20><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>ȷ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|||
|
|
(sum == 0) && // <20><>У<EFBFBD><D0A3>
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
memcpy(pRandom, bBuf + 2, bLen);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rst = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>Flash
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// pbData - <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD>ַ
|
|||
|
|
// bLen - <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//˵<><CBB5>:
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 SMEC_ReadFlash(u16 wAddr, u8 *pbData, u8 bLen)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
if ((pbData == NULL) || (bLen > 124) || (bLen == 0))
|
|||
|
|
{
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x03;
|
|||
|
|
bBuf[1] = (u8)(wAddr>>8);
|
|||
|
|
bBuf[2] = (u8) wAddr;
|
|||
|
|
bBuf[3] = bLen; //<2F><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, 4);
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, (bLen+2));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<(bLen+2);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((rst == 0) &&
|
|||
|
|
(bBuf[0] == 0x83) && // 0x83 <20><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>ȷ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|||
|
|
(sum == 0) && // <20><>У<EFBFBD><D0A3>
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
memcpy(pbData, bBuf + 2, bLen);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rst = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>Flash
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// wAddr - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//˵<><CBB5>:
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 SMEC_EraseFlash(u16 wAddr)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x04;
|
|||
|
|
bBuf[1] = (u8)(wAddr>>8);
|
|||
|
|
bBuf[2] = (u8) wAddr;
|
|||
|
|
bBuf[3] = 0x00;
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, 4);
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, 2);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<2;i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((rst == 0) &&
|
|||
|
|
(bBuf[0] == 0x84) && // 0x84 <20><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>ȷ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|||
|
|
(sum == 0) && // <20><>У<EFBFBD><D0A3>
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rst = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: дFlash
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// pbData - д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD>ַ
|
|||
|
|
// bLen - д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//˵<><CBB5>:
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 SMEC_WriteFlash(u16 wAddr, u8 *pbData, u8 bLen)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
if ((pbData == NULL) || (bLen > 124) || (bLen == 0))
|
|||
|
|
{
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x05;
|
|||
|
|
bBuf[1] = (u8)(wAddr>>8);
|
|||
|
|
bBuf[2] = (u8) wAddr;
|
|||
|
|
bBuf[3] = bLen; //<2F><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
memcpy(&bBuf[4], pbData, bLen);
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, bLen + 4);
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, 2);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
for (i=0;i<2;i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((rst == 0) &&
|
|||
|
|
(bBuf[0] == 0x85) && // 0x85 <20><>ʾִ<CABE><D6B4><EFBFBD><EFBFBD>ȷ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|||
|
|
(sum == 0) && // <20><>У<EFBFBD><D0A3>
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rst = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// key - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0~127)
|
|||
|
|
// pbData - д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD>ַ
|
|||
|
|
// bLen - д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//˵<><CBB5>:
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 SMEC_EncryptionData(u8 key, u8 *pbData, u8 bLen)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
if ((pbData == NULL) || (key > 127) || (bLen >= 124) || (bLen == 0))
|
|||
|
|
{
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x06;
|
|||
|
|
bBuf[1] = 0x00;
|
|||
|
|
bBuf[2] = key;
|
|||
|
|
bBuf[3] = bLen; //<2F><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
memcpy(&bBuf[4], pbData, bLen);
|
|||
|
|
|
|||
|
|
sum = 0;
|
|||
|
|
for (i=0;i<(bLen+4);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
bBuf[1] = 0 - sum;
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, bLen + 4);
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, (bLen+2));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
sum = 0;
|
|||
|
|
for (i=0;i<(bLen+2);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
if (sum != 0)
|
|||
|
|
{
|
|||
|
|
rst |= 4;
|
|||
|
|
}
|
|||
|
|
else if (bBuf[0] != 0x86)
|
|||
|
|
{
|
|||
|
|
rst = bBuf[0];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
memcpy(pbData, bBuf + 2, bLen);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// key - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0~127)
|
|||
|
|
// pbData - д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD>ַ
|
|||
|
|
// bLen - д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ˵<D6B5><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
// 0 - <20>ɹ<EFBFBD>
|
|||
|
|
// 1 - ʧ<><CAA7>
|
|||
|
|
//˵<><CBB5>:
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
u8 SMEC_DecryptionData(u8 key, u8 *pbData, u8 bLen)
|
|||
|
|
{
|
|||
|
|
u8 i = 0;
|
|||
|
|
u8 rst = 0;
|
|||
|
|
u8 sum = 0;
|
|||
|
|
u8 bBuf[128] = {0};
|
|||
|
|
|
|||
|
|
if ((pbData == NULL) || (key > 127) || (bLen >= 124) || (bLen == 0))
|
|||
|
|
{
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bBuf[0] = 0x07;
|
|||
|
|
bBuf[1] = 0x00;
|
|||
|
|
bBuf[2] = key;
|
|||
|
|
bBuf[3] = bLen; //<2F><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
memcpy(&bBuf[4], pbData, bLen);
|
|||
|
|
|
|||
|
|
sum = 0;
|
|||
|
|
for (i=0;i<(bLen+4);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
bBuf[1] = 0 - sum;
|
|||
|
|
|
|||
|
|
rst = IIC_WriteWithAddr(IIC_ADDR & 0xFE, bBuf, bLen + 4);
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
rst = IIC_ReadWithAddr(IIC_ADDR | 0x1, bBuf, (bLen+2));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
sum = 0;
|
|||
|
|
for (i=0;i<(bLen+2);i++)
|
|||
|
|
{// У<><D0A3><EFBFBD><EFBFBD>
|
|||
|
|
sum += bBuf[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
if (sum != 0)
|
|||
|
|
{
|
|||
|
|
rst |= 4;
|
|||
|
|
}
|
|||
|
|
else if (bBuf[0] != 0x87)
|
|||
|
|
{
|
|||
|
|
rst = bBuf[0];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rst == 0)
|
|||
|
|
{
|
|||
|
|
memcpy(pbData, bBuf + 2, bLen);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>оƬ<D0BE><C6AC>֤
|
|||
|
|
int SMEC_Detection(void)
|
|||
|
|
{
|
|||
|
|
int rslt = 0;
|
|||
|
|
u8 dat1[12] = {0};
|
|||
|
|
u8 dat2[12] = {0};
|
|||
|
|
|
|||
|
|
rslt = SMEC_GetUid(dat1);
|
|||
|
|
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
rslt = SMEC_GetRandom(dat1,12);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
memcpy(dat2, dat1, 12);
|
|||
|
|
rslt = SMEC_EncryptionData(0, dat2, 12);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
rslt = SMEC_DecryptionData(0, dat2, 12);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
for (int i=0;i<12;i++)
|
|||
|
|
{
|
|||
|
|
if (dat2[i] != dat1[i])
|
|||
|
|
{
|
|||
|
|
rslt = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|