📄 xp_vc33_body.c
字号:
{
Delay_N_uS(6);
if ( d & BIT7 )
SET_SDA;//I2C_SDA =1;
else
RESET_SDA;//I2C_SDA =0;
Delay_N_uS(6);
SET_SCLK;//I2C_SCK = 1;
Delay_N_uS(6);
RESET_SCLK;//I2C_SCK = 0;
d = d << 1;
}
Delay_N_uS(6);
SET_SDA;//I2C_SDA = 1;
xp_SetSdaIn();
Delay_N_uS(6);
SET_SCLK;//I2C_SCK = 1;
Delay_N_uS(6);
bit_ack =! READ_SDA;//I2C_SDA
Delay_N_uS(6);
RESET_SCLK;//I2C_SCK =0;
Delay_N_uS(6);
xp_SetSdaOut();
Delay_N_uS(6);
return bit_ack;
}
uchar I2C_Receive_Byte(void)
{
uchar i = 8, d = 0;
RESET_SCLK;
Delay_N_uS(6);
while ( i--)
{
SET_SDA;
Delay_N_uS(6);
xp_SetSdaIn();
d = d << 1;
Delay_N_uS(6);
SET_SCLK;//I2C_SCK =1;
Delay_N_uS(6);
if ( READ_SDA )//I2C_SDA
d++;
RESET_SCLK;//I2C_SCK =0;
Delay_N_uS(6);
xp_SetSdaOut();
}
return d;
}
void xp_SEPROM_WriteBlock(uchar *buffer,uint AT24C64_address,uint count)
{
//Delay_N_mS(40);
while(count--)
{
I2C_Start();
/*I2C_Send_Byte( 0xa0 + AT24C64_address /256 *2);*/ /* 24C16 USE */
if(I2C_Send_Byte( 0xa2 ))
if(I2C_Send_Byte( AT24C64_address/256 ))
if(I2C_Send_Byte( AT24C64_address %256 ))
if(I2C_Send_Byte( *buffer ))
I2C_Stop();
Delay_N_mS(12); /* 12 waiting for write cycle to be completed */
buffer++;
AT24C64_address++;
}
}
void xp_SEPROM_ReadBlock(uchar *buffer,uint AT24C64_address,uint count)
{
while(count--)
{
I2C_Start();
/*I2C_Send_Byte( 0xa0 + AT24C64_address / 256 *2 );*/ /* 24C16 USE */
if(I2C_Send_Byte( 0xa2 ))
if(I2C_Send_Byte( AT24C64_address/256 ))
if(I2C_Send_Byte( AT24C64_address % 256 ))
I2C_Start();
/*I2C_Send_Byte( 0xa1 + AT24C64_address /256 *2 );*/
if(I2C_Send_Byte( 0xa3 ))
*buffer = I2C_Receive_Byte();
I2C_Nack();
I2C_Stop();
buffer++;
AT24C64_address++;
}
}
/************************************************************************/
/* 开关量输入输出 */
/************************************************************************/
int xp_SWITCH_In(void)//读取输入开关量
{
int result = 0;
#if _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
result = (~R_KI_20) & 0xfffff;
#else
//
#endif
return result;
}
void xp_SWITCH_Out(int outdata)//输出开关量
{
W_KO_16 = outdata;
}
void xp_SWITCH_OutEnable(bool yesorno)//开关量输出使能
{
#if _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
W_OUTEN = yesorno;
#else
//
#endif
}
/************************************************************************/
/* 模拟输入 */
/************************************************************************/
void xp_AD_SelectChannelGroup(int chgroup)//选择模拟通道
{
W_ADCH = chgroup;
}
void xp_AD_Start(void)//启动AD 转换
{
int read = R_AD_START;
}
bool xp_AD_Over(void)//AD转换结束了吗?
{
uint over = R_GPS_ADST_FREST & BIT1;
if(over)
return false;
else
return true;
}
/*
* result 必须是四维浮点数组的头指针
*/
void xp_AD_QueryRead(double* result)//查询法读AD 转换结果
{
int i,read;
for(i = 0; i < 4; i++)
{
read = R_AD_RESULT & 0x3fff;
*(result + i) = ADResConv(read);
}
}
/************************************************************************/
/* 测频 */
/************************************************************************/
/*
* 输入的正弦波先经过整形,然后2分频,再进行测频
*/
/*
* 采用内部时钟方式计数时,每单位50ns,两路测频都采用查询法
* ,它们都靠定时器1来计数 BIT2--4 BIT3---1
*/
double xp_FREQ_TestOne(void)//测量第一路模拟输入信号的频率
{
/**查询法计分频后半个周期**/
int tmp = 0;
double result = 0.0;
#if _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
xp_VC33_StopTimer(TIMER1);
xp_VC33_SetTimer(TIMER1,INFINITE);
if(R_GPS_ADST_FREST & BIT3)/*现在是高电平*/
{
while (R_GPS_ADST_FREST & BIT3)/*下降沿到了跳出循环开始计数*/
{
;
}
xp_VC33_StartTimer(TIMER1);
while (!(R_GPS_ADST_FREST & BIT3))/*上升沿到了跳出循环停止计数*/
{
;
}
tmp = xp_VC33_StopTimer(TIMER1);
result = 1 * 10e9/ (tmp * 50.0 );
}
else/*现在是低电平*/
{
while (!(R_GPS_ADST_FREST & BIT3))/*上升沿到了跳出循环开始计数*/
{
;
}
xp_VC33_StartTimer(TIMER1);
while (R_GPS_ADST_FREST & BIT3)/*下降沿到了跳出循环停止计数*/
{
;
}
tmp = xp_VC33_StopTimer(TIMER1);
result = 1 * 10e9/ (tmp * 50.0 );
}
#else
//
#endif
return result;
}
double xp_FREQ_TestFour(void)// 测量第四路模拟输入信号的频率
{
/**查询法计分频后半个周期**/
int tmp = 0;
double result = 0.0;
#if _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
xp_VC33_StopTimer(TIMER1);
xp_VC33_SetTimer(TIMER1,INFINITE);
if(R_GPS_ADST_FREST & BIT2)/*现在是高电平*/
{
while (R_GPS_ADST_FREST & BIT2)/*下降沿到了跳出循环开始计数*/
{
;
}
xp_VC33_StartTimer(TIMER1);
while (!(R_GPS_ADST_FREST & BIT2))/*上升沿到了跳出循环停止计数*/
{
;
}
tmp = xp_VC33_StopTimer(TIMER1);
result = 1 * 10e9/ (tmp * 50.0 );
}
else/*现在是低电平*/
{
while (!(R_GPS_ADST_FREST & BIT2))/*上升沿到了跳出循环开始计数*/
{
;
}
xp_VC33_StartTimer(TIMER1);
while (R_GPS_ADST_FREST & BIT2)/*下降沿到了跳出循环停止计数*/
{
;
}
tmp = xp_VC33_StopTimer(TIMER1);
result = 1 * 10e9/ (tmp * 50.0 );
}
#else
//
#endif
return result;
}
/************************************************************************/
/* 串口通信 */
/************************************************************************/
void xp_COM_Init(int channel)/*打开串口*/
{
int temp;
switch(channel)
{
case 0:
LCRA=0x80; /*选择特殊寄存器组*/
DLLA=0x0c; /*设置波特率为9600bps*/
DLMA=0;
LCRA=0x03;
//MCRA=0x0f;
IERA=0x01;
FCRA=0xc7;
temp = (RHRA) & BYTE0;
break;
case 1:
LCRB=0x80; /*选择特殊寄存器组*/
DLLB=0x0c; /*设置波特率为9600bps*/
DLMB=0;
LCRB=0x03;
MCRB=0x08;
IERB=0x01;
FCRB=0xc7;
temp = (RHRB) & BYTE0;
break;
case 2:
LCRC=0x80; /*选择特殊寄存器组*/
DLLC=0x0c; /*设置波特率为9600bps*/
DLMC=0;
LCRC=0x03;
//MCRC=0x02;
IERC=0x01;
FCRC=0xc7;
temp = (RHRC) & BYTE0;
break;
case 3:
LCRD=0x80; /*选择特殊寄存器组*/
DLLD=0x0c; /*设置波特率为9600kbps*/
DLMD=0;
LCRD=0x03;
MCRD=0x08;
IERD=0x01;
FCRD=0xc7;
temp = (RHRD) & BYTE0;
break;
default:
break;
}
}
uint xp_COM_Flag(void)/*有字符到了的串口标志*/
{
uint comFlag = 0;
comFlag = R_UART & 0xf;
return comFlag;
}
void xp_COM_ClearFlag(void)/*清串口标志*/
{
int clearFlag;
clearFlag = R_CLRUARTINT;
}
char xp_COM_ReadChar(int channel)/*从串口读取一个字节*/
{
unsigned char data;
switch(channel)
{
case 0:
MCRA=0;
while(((LSRA) & 0x01)==1) /*等待数据到*/
data=(RHRA) & BYTE0;
break;
case 1:
MCRB=0;
while(((LSRB) & 0x01)==1)
data=(RHRB) & BYTE0;
break;
case 2:
//MCRC=0;
while(((LSRC) & 0x01)==1)
data=(RHRC) & BYTE0;
break;
case 3:
MCRD=0;
while(((LSRD) & 0x01)==1)
data=(RHRD) & BYTE0;
break;
default:
return -1;
}
/*接收数据*/
return data; /*接收成功*/
}
void xp_COM_WriteChar(int channel,char data)//向串口写一个字节
{
/*发送数据*/
switch(channel)
{
case 0:
MCRA=0x03;
while(((LSRA) & 0x20)==0);
THRA=data;
while(((LSRA) & 0x20)!=0);
MCRA=0x0;
break;
case 1:
MCRB=0x03;
while(((LSRB) & 0x20)==0);
THRB=data;
while(((LSRB) & 0x20)!=0);
MCRB=0x0;
break;
case 2:
//MCRC=0x03;
while(((LSRC) & 0x20)==0);
THRC=data;
while(((LSRC) & 0x20)!=0);
//MCRC=0x0;
break;
case 3:
MCRD=0x03;
while(((LSRD) & 0x20)==0);
THRD=data;
while(((LSRD) & 0x20)!=0);
MCRD=0x0;
break;
default:
break;
}
}
bool xp_COM_SendString(int channel,char* szStr,uint length)
{
uint i = 0;
if(length <= 0)
return false;
switch(channel) {
case UARTA:
for(i = 0; i < length; i++)
xp_COM_WriteChar(UARTA,szStr[i]);
break;
case UARTB:
for(i = 0; i < length; i++)
xp_COM_WriteChar(UARTB,szStr[i]);
break;
case UARTC:
for(i = 0; i < length; i++)
xp_COM_WriteChar(UARTC,szStr[i]);
break;
case UARTD:
for(i = 0; i < length; i++)
xp_COM_WriteChar(UARTD,szStr[i]);
break;
default:
break;
}
return true;
}
void clear_string(char* buffer,int len)
{
int i;
for(i = 0; i < len; i++)
{
*(buffer+i) = 0;
}
}
bool region_ok(unsigned int ustart,unsigned int uend)
{
bool beprom,bsram,bio,buarta,buartb,buartc,buartd,bnvram,bclock_can,bresult = false;
beprom = (ustart >= 0x400000) && (uend <= 0x47ffff);
bsram = (ustart >= 0xf80000) && (uend <= 0xfc0000);
bio = (ustart >= 0x100000) && (uend <= 0x10000f);
buarta = (ustart >= 0x700008) && (uend <= 0x70000f);
buartb = (ustart >= 0x740008) && (uend <= 0x74000f);
buartc = (ustart >= 0x780008) && (uend <= 0x78000f);
buartd = (ustart >= 0x7c0008) && (uend <= 0x7c000f);
bnvram = (ustart >= 0x600000) && (uend <= 0x61ffff);
bclock_can = (ustart >= 0xc00001) && (uend <= 0xc00003);
bresult = beprom || bsram || bio || buarta || buartb || buartc || buartd || bnvram || bclock_can;
return bresult;
}
/************************************************************************/
/* CAN 通信 */
/************************************************************************/
void xp_CAN_Init(void)//初始化CAN
{
unsigned char can_ctrl;
CAN_ADDRESS = CAN_CTRL;
can_ctrl = CAN_DATA & BYTE0;
while (!can_ctrl & RESREQ)
{
CAN_ADDRESS = CAN_CTRL;
CAN_DATA = RESREQ;
}
CAN_ADDRESS = CAN_AC; CAN_DATA = OWN_ID;
CAN_ADDRESS = CAN_AM; CAN_DATA = ACCEPTMASK;
CAN_ADDRESS = CAN_TMG_0; CAN_DATA = 0x03;
CAN_ADDRESS = CAN_TMG_1; CAN_DATA = 0x1c;
CAN_ADDRESS = CAN_OCR; CAN_DATA = 0xde;
CAN_ADDRESS = CAN_CLKDIV; CAN_DATA = 0x07;
CAN_ADDRESS = CAN_CTRL; CAN_DATA = 0x5e;
CAN_ADDRESS = CAN_CMD ; CAN_DATA = 0x0c;
}
void xp_CAN_DumpReg(void)//
{
unsigned char tmp_read;
printf("SJA1000 Registers:\n\n");
CAN_ADDRESS = CAN_CTRL; tmp_read = CAN_DATA & BYTE0;
printf("CTRL = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_CTRL; tmp_read = CAN_DATA & BYTE0;
printf("CMD = 0x%X\n", CAN_CMD);
CAN_ADDRESS = CAN_STATUS; tmp_read = CAN_DATA & BYTE0;
printf("STATUS = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_INT; tmp_read = CAN_DATA & BYTE0;
printf("INT = 0x%X\n",tmp_read);
CAN_ADDRESS = CAN_AC; tmp_read = CAN_DATA & BYTE0;
printf("AC = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_AM; tmp_read = CAN_DATA & BYTE0;
printf("AM = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_TMG_0; tmp_read = CAN_DATA & BYTE0;
printf("TMG_0 = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_TMG_1; tmp_read = CAN_DATA & BYTE0;
printf("TMG_1 = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_OCR; tmp_read = CAN_DATA & BYTE0;
printf("OCR = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_TEST; tmp_read = CAN_DATA & BYTE0;
printf("TEST = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_TX_ID; tmp_read = CAN_DATA & BYTE0;
printf("TX_ID = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_TX_LEN; tmp_read = CAN_DATA & BYTE0;
printf("TX_LEN = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_TX_BUF0; tmp_read = CAN_DATA & BYTE0;
printf("TX_BUF = 0x%X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF1; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF2; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF3; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF4; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF5; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF6; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_TX_BUF7; tmp_read = CAN_DATA & BYTE0;
printf(" %X\n", tmp_read);
CAN_ADDRESS = CAN_RX_ID; tmp_read = CAN_DATA & BYTE0;
printf("RX_ID = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_RX_LEN; tmp_read = CAN_DATA & BYTE0;
printf("RX_LEN = 0x%X\n", tmp_read);
CAN_ADDRESS = CAN_RX_BUF0; tmp_read = CAN_DATA & BYTE0;
printf("RX_BUF = 0x%X",tmp_read );
CAN_ADDRESS = CAN_RX_BUF1; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_RX_BUF2; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_RX_BUF3; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_RX_BUF4; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_RX_BUF5; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_RX_BUF6; tmp_read = CAN_DATA & BYTE0;
printf(" %X", tmp_read);
CAN_ADDRESS = CAN_RX_BUF7; tmp_read = CAN_DATA & BYTE0;
printf(" %X\n", tmp_read);
CAN_ADDRESS = CAN_CLKDIV; tmp_read = CAN_DATA & BYTE0;
printf("CLKDIV = 0x%X\n\n", tmp_read);
}
XP_CAN_FRAME xp_CAN_ReadFrame(void)//从CAN读取一帧数据
{
XP_CAN_FRAME canframe;
unsigned int id;
unsigned char len;
unsigned char ustatus,urxid,urxlen,urxb0,urxb1,urxb2,urxb3,urxb4,urxb5,urxb6,urxb7,ucmd;
CAN_ADDRESS = CAN_STATUS; ustatus = CAN_DATA & BYTE0;
if (CAN_STATUS & RBS) {
CAN_ADDRESS = CAN_RX_ID; urxid = CAN_DATA & BYTE0;
CAN_ADDRESS = CAN_RX_LEN; urxlen = CAN_DATA & BYTE0;
id = ((unsigned int)CAN_RX_ID << 3) + ((CAN_RX_LEN >> 5) & 0x07);
CAN_ADDRESS = CAN_RX_LEN; urxlen = CAN_DATA & BYTE0;
len = urxlen;
printf("RX_ID = 0x%X, ", id);
printf("RX_LEN = 0x%X, ", len);
CAN_ADDRESS = CAN_RX_BUF0; urxb0 = CAN_DATA & BYTE0; canframe.frame[0] = urxb0;
CAN_ADDRESS = CAN_RX_BUF1; urxb1 = CAN_DATA & BYTE0; canframe.frame[1] = urxb1;
CAN_ADDRESS = CAN_RX_BUF2; urxb2 = CAN_DATA & BYTE0; canframe.frame[2] = urxb2;
CAN_ADDRESS = CAN_RX_BUF3; urxb3 = CAN_DATA & BYTE0; canframe.frame[3] = urxb3;
printf("RX_BUF = 0x%X %X %X %X",urxb0, urxb1 , urxb2,urxb3);
CAN_ADDRESS = CAN_RX_BUF4; urxb4 = CAN_DATA & BYTE0; canframe.frame[4] = urxb4;
CAN_ADDRESS = CAN_RX_BUF5; urxb5 = CAN_DATA & BYTE0; canframe.frame[5] = urxb5;
CAN_ADDRESS = CAN_RX_BUF6; urxb6 = CAN_DATA & BYTE0; canframe.frame[6] = urxb6;
CAN_ADDRESS = CAN_RX_BUF7; urxb7 = CAN_DATA & BYTE0; canframe.frame[7] = urxb7;
printf(" %X %X %X %X\n",urxb4 ,urxb5 , urxb6,urxb7);
CAN_ADDRESS = CAN_CMD; CAN_DATA = RRB;
}
return canframe;
}
void xp_CAN_WriteFrame(XP_CAN_FRAME canframe)//向CAN写一帧数据
{
unsigned int id;
unsigned char len;
id = 0x500;
len = 8;
CAN_ADDRESS = CAN_TX_ID; CAN_DATA = id >> 3;
CAN_ADDRESS = CAN_TX_LEN; CAN_DATA = ((id & 0x07) << 5) | len;
CAN_ADDRESS = CAN_TX_BUF0; CAN_DATA = canframe.frame[0];
CAN_ADDRESS = CAN_TX_BUF1; CAN_DATA = canframe.frame[1];
CAN_ADDRESS = CAN_TX_BUF2; CAN_DATA = canframe.frame[2];
CAN_ADDRESS = CAN_TX_BUF3; CAN_DATA = canframe.frame[3];
CAN_ADDRESS = CAN_TX_BUF4; CAN_DATA = canframe.frame[4];
CAN_ADDRESS = CAN_TX_BUF5; CAN_DATA = canframe.frame[5];
CAN_ADDRESS = CAN_TX_BUF6; CAN_DATA = canframe.frame[6];
CAN_ADDRESS = CAN_TX_BUF7; CAN_DATA = canframe.frame[7];
CAN_ADDRESS = CAN_CMD; CAN_DATA = TXREQ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -