#include "RN7302_Demo.h"
__no_init sDl645StruDataComm_TypeDef Dl645RN7302DataComm;
__no_init sDl645FrontTmp_TypeDef Dl645FrontTmp;
__no_init sDl645Front_TypeDef Dl645Front;
__no_init sDl645Eg_TypeDef Dl645Eg;
__no_init sDl645FirmParaFile_TypeDef Dl645FirmPara;
//底层函数
u8 fnSpi2_ReadByte(void)
{
u8 i,temp=0;
for(i=0;i<8;i++)
{
temp<<=1;
PinWrite_ADSCLK(1);
PinWrite_ADSCLK(1);
fnDelay2us();
fnDelay2us();
fnDelay2us();
fnDelay2us();
PinWrite_ADSCLK(0);
PinWrite_ADSCLK(0);
fnDelay2us();
fnDelay2us();
fnDelay2us();
fnDelay2us();
if (PinRead_ADSDI()){temp=temp+0x1;}
fnDelay2us();
fnDelay2us();
fnDelay2us();
}
return temp;
}
//////////////////////////////////////////////////////////////////////////
void fnSpi2_WriteByte(u8 Dat)
{
u8 i;
for(i=0;i<8;i++)
{
PinWrite_ADSCLK(1);
PinWrite_ADSCLK(1);
fnDelay2us();
fnDelay2us();
if(Dat & 0x80)
{
PinWrite_ADSDO(1);
PinWrite_ADSDO(1);
fnDelay2us();
fnDelay2us();
fnDelay2us();
}
else
{
PinWrite_ADSDO(0);
PinWrite_ADSDO(0);
fnDelay2us();
fnDelay2us();
fnDelay2us();
}
PinWrite_ADSCLK(0);
PinWrite_ADSCLK(0);
fnDelay2us();
fnDelay2us();
fnDelay2us();
Dat <<= 1;
}
PinWrite_ADSDO(1);
PinWrite_ADSDO(1);
fnDelay2us();
fnDelay2us();
fnDelay2us();
}
//存储器写入函数
ErrorStatus fnMemory_Write(u32 Dst , u8 *Src , u32 DatLen)
{
ErrorStatus err;
if( (FM24C_START_ADDR <= Dst) &&
( (Dst + DatLen) < (FM24C_START_ADDR + FM24C_SIZE) ) )
{
#if !DL645SOFT_DEBUG
err = fnFM24CXX_Write(Dst- FM24C_START_ADDR , Src , DatLen , 3);
if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
#endif
}
else if( (AT45DB_START_ADDR <= Dst) &&
( (Dst + DatLen) < (AT45DB_START_ADDR + AT45DB_SIZE) ) )
{
#if !DL645SOFT_DEBUG
err = fnAT45DBXX_Write( Dst - AT45DB_START_ADDR , Src , DatLen , 3);
if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
#endif
}
else
{
err = ERROR;
Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
}
return(err);
}
//存储器读取函数
ErrorStatus fnMemory_Read(u8 *Dst , u32 Src , u32 DatLen)
{
ErrorStatus err;
if( (FM24C_START_ADDR <= Src) &&
( (Src + DatLen) < (FM24C_START_ADDR + FM24C_SIZE) ) )
{
#if !DL645SOFT_DEBUG
err = fnFM24CXX_Read(Dst , Src - FM24C_START_ADDR , DatLen , 3);
if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
#endif
}
else if( (AT45DB_START_ADDR <= Src) &&
( (Src + DatLen) < (AT45DB_START_ADDR + AT45DB_SIZE) ) )
{
#if !DL645SOFT_DEBUG
err = fnAT45DBXX_Read(Dst , Src - AT45DB_START_ADDR , DatLen , 3);
if(err==ERROR) Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_INTERMEMORY;
else Dl645Bkgrd.PubData.EventErr[5]=BKGRD_EVENTERR_OK;
#endif
}
else
{
err = ERROR;
}
return(err);
}
// 文件操作函数
ErrorStatus fnDl645File_Read(u8 FileId , u32 OffAddr , void *Dst , u32 Len)
{
if(FileId >= Dl645FileId_Max) return(ERROR);
if( (OffAddr + Len) > Dl645FileInfo[FileId].Len) return(ERROR);
return(fnMemory_Read(Dst , Dl645FileInfo[FileId].StartAddr + OffAddr , Len) );
}
ErrorStatus fnDl645File_Write(u8 FileId , u32 OffAddr , void *Src , u32 Len)
{
if(FileId >= Dl645FileId_Max) return(ERROR);
if( (OffAddr + Len) > Dl645FileInfo[FileId].Len) return(ERROR);
return(fnMemory_Write(Dl645FileInfo[FileId].StartAddr + OffAddr , Src , Len) );
}
ErrorStatus fnRN7302_Write(u16 wReg,u8 *pBuf,u8 DatLen)
{
u8 i,temp,chksum,Repeat;
ErrorStatus err = SUCCESS;
if( (DatLen == 0) || (DatLen > 4) ) return(ERROR);
for( Repeat =3; Repeat != 0 ; Repeat--)
{
PinWrite_ADCS(0);
NOP();
temp = (u8)(wReg & 0x00ff);
chksum = temp;
fnSpi2_WriteByte( temp); //first write hight Addr
temp = (((u8)(wReg >> 4)) & 0xf0) + 0x80;
chksum += temp;
fnSpi2_WriteByte( temp);
for(i = DatLen; i > 0;i-- )
{
fnSpi2_WriteByte(pBuf[i-1]); // first write high data
chksum +=pBuf[i-1];
}
chksum = ~chksum;
fnSpi2_WriteByte(chksum);
// PinWrite_ADCS(1);
// NOP();
//读WData寄存器检查-----------------------
// PinWrite_ADCS(0);
// NOP();
fnSpi2_WriteByte( 0x8D);
chksum = 0x8D;
temp = ( (u8)(0x018D >> 4) & 0xf0);
fnSpi2_WriteByte( temp );
chksum += temp;
for(i = 3 ; i > 0 ; i--)
{
temp = fnSpi2_ReadByte();
if(DatLen >= i)
{
if(temp != pBuf[i - 1])
{
err = ERROR;
break;
}
}
chksum += temp;
}
if(err == SUCCESS)
{
chksum = ~chksum;
temp = fnSpi2_ReadByte();
if(temp != chksum) err = ERROR;
}
PinWrite_ADCS(1);
if(err == SUCCESS) break;
fnDelay2us();
fnDelay2us();
}
PinWrite_ADSDO(1);
PinWrite_ADSCLK(1);
return(err);
}
ErrorStatus fnRN7302_Read(u16 wReg,u8 *pBuf,u8 DatLen)
{
u8 i,temp,chksum,Repeat;
ErrorStatus err = SUCCESS;
if(DatLen == 0) return(ERROR);
for( Repeat=3; Repeat != 0 ; Repeat--)
{
PinWrite_ADCS(0);
fnDelay2us();
temp = (u8)(wReg & 0x00ff);
chksum = temp;
fnSpi2_WriteByte( temp); //first write hight Addr
temp = ((u8)(wReg >> 4))& 0xf0;
chksum += temp;
fnSpi2_WriteByte( temp);
for(i = DatLen; i > 0;i--)
{
pBuf[i-1] = fnSpi2_ReadByte();
chksum += pBuf[i-1];
}
chksum = ~chksum;
if(fnSpi2_ReadByte()!=chksum) err = ERROR;
// PinWrite_ADCS(1);
//---读RData寄存器检查------------------------------------
if(err != SUCCESS) continue;
fnSpi2_WriteByte( 0x8c);//读上一次SPI 读出的数据
chksum = 0x8c;
temp = ( (u8)(0x018C >> 4) & 0xf0);
fnSpi2_WriteByte( temp );
chksum += temp;
for(i = 4 ; i > 0 ; i--)
{
temp = fnSpi2_ReadByte();
if(DatLen >= i)
{
if(temp != pBuf[i - 1])
{
err = ERROR;
break;
}
}
chksum += temp;
}
if(err == SUCCESS)
{
chksum = ~chksum;
temp = fnSpi2_ReadByte();
if(temp != chksum) err = ERROR;
}
PinWrite_ADCS(1);
if(err == SUCCESS) break;
fnDelay2us();
fnDelay2us();
}
PinWrite_ADCS(1);
PinWrite_ADSDO(1);
PinWrite_ADSCLK(1);
return(err);
}
void fnRN7302_Init(void)
{
Dl645RN7302DataComm.ucTemp8 = 0xe5; // 写使能位
fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
Dl645RN7302DataComm.ucTemp8 = 0xA2; // 切换到EMM模式
fnRN7302_Write(WMSW,Dl645RN7302DataComm.ucTempBuf,1);
Dl645RN7302DataComm.ucTemp8 = 0xfa; // 写使能位
fnRN7302_Write(0x0182,Dl645RN7302DataComm.ucTempBuf,1);
SystemDelay(10);
Dl645RN7302DataComm.ucTemp8 = 0xe5; // 写使能位
fnRN7302_Write(0x0180,Dl645RN7302DataComm.ucTempBuf,1);
Dl645RN7302DataComm.ucTemp8 = 0xA2; // 切换到EMM模式
fnRN7302_Write(WMSW,Dl645RN7302DataComm.ucTempBuf,1);
评论9