📄 x5045_drive.c
字号:
/*C**************************************************************************
* NAME: X5045_Drive.c
*----------------------------------------------------------------------------
* Copyright (c) 2008 HIT(WH)
*----------------------------------------------------------------------------
* CREATED_BY: Cai Xianjun
* CREATION_DATE: 2008/12/17
* AUTHOR: $Cai Xianjun$
* REVISI0N: $Revision: 1.0 $
* DATE: $Date: 2008/12/17 08:00:00 $
* MODIFIED DATE :
* MODIFIED AUTHOR:
*----------------------------------------------------------------------------
* PURPOSE: Used for AT90CAN128
*
*****************************************************************************/
#include <avr/io.h>
#include "X5045_Drive.h"
#include <avr/sfr_defs.h>
#include <avr/iocanxx.h>
unsigned char an_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*F**************************************************************************
* NAME: watch_dog
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void watch_dog(void)
{
PORTB &= ~_BV(X5045_CS); //CS LOW
PORTB |= _BV(X5045_CS); //CS high
}
/*F**************************************************************************
* NAME: ep_init
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void ep_init(void)
{
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB |= _BV(X5045_CS); //CS high
PORTB &= ~_BV(X5045_CS); //CS LOW
PORTB &= ~_BV(X5045_CS); //CS LOW
PORTB |= _BV(X5045_CS); //CS high
}
/*F**************************************************************************
* NAME: read_ep
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
unsigned char read_ep(void)
{
unsigned char m,i;
m=0;
for(i=0;i<8;i++)
{
PORTE |= _BV(X5045_SCK); //SCK high
Delay_Xms(X5045_delay);
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
if(PING&0x10)
{
m|=an_dat[7-i];
}
}
return(m);
}
/*F**************************************************************************
* NAME: watchdog_set
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void watchdog_set(unsigned char reset_type)
{
ep_ewen();
PORTB |= _BV(X5045_CS); //CS high
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB &= ~_BV(X5045_CS); //CS LOW
write_ep(1);
write_ep(reset_type);//0x30-->no 0x20-->200ms 0x10h-->600ms 0x00-->1.4s
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB |= _BV(X5045_CS); //CS high
ep_wait();
}
/*F**************************************************************************
* NAME: ep_ewen
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void ep_ewen(void)
{
ep_init();
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB &= ~_BV(X5045_CS); //CS LOW
write_ep(6);
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB |= _BV(X5045_CS); //CS high
}
/*F**************************************************************************
* NAME: write_ep
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void write_ep(unsigned char wr_data)
{
unsigned char m,i;
for(i=0;i<8;i++)
{
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
m=wr_data&an_dat[7-i];
if(m!=0)
PORTB |= _BV(X5045_SI); //SI high
else
PORTB &= ~_BV(X5045_SI); //SI low
PORTE |= _BV(X5045_SCK); //SCK high
Delay_Xms(X5045_delay);
}
PORTB &= ~_BV(X5045_SI); //SI low
}
/*F**************************************************************************
* NAME: ep_wait
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void ep_wait(void)
{
unsigned char m,n;
unsigned int i;
for(i=0;i<5000;i++)
{
m=read_rdsr();
n=m&0x01;
if(n==0)break;
}
}
/*F**************************************************************************
* NAME: read_rdsr
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
unsigned char read_rdsr(void)
{
unsigned char m;
ep_init();
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB &= ~_BV(X5045_CS); //CS LOW
write_ep(5);
m=read_ep();
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB |= _BV(X5045_CS); //CS high
return(m);
}
/*F**************************************************************************
* NAME: WriteByte2rom
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void WriteByte2rom(unsigned int address,unsigned char Data)
{
unsigned char up,down;
up=address/0x100;
down=address%0x100;
ep_ewen();
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB &= ~_BV(X5045_CS); //CS LOW
if(up==0)
write_ep(0x2);
else if(up>0)
write_ep(0xa);
write_ep(down);
write_ep(Data);
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB |= _BV(X5045_CS); //CS high
ep_wait();
}
/*F**************************************************************************
* NAME: ReadByteFrom
*----------------------------------------------------------------------------
* AUTHOR: $Cai Xianjun$
* MODIFIED DATE : $Date: 2008/12/17 15:30:00 $
*----------------------------------------------------------------------------
* PURPOSE:
*
*----------------------------------------------------------------------------
* PARAMS:
*
*
* return:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
unsigned char ReadByteFrom(unsigned int address)
{
unsigned char up,down,temp;
up=address/0x100;
down=address%0x100;
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB &= ~_BV(X5045_CS); //CS LOW
if(up==0)
write_ep(0x3);
else if(up>0)
write_ep(0xb);
write_ep(down);
temp=read_ep();
PORTE &= ~_BV(X5045_SCK); //SCK LOW
Delay_Xms(X5045_delay);
PORTB |= _BV(X5045_CS); //CS high
ep_wait();
return temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -