关于用FPGA对sja1000进行初始化的问题
我用pio口与sja1000的各引脚相连,初始化的时候读写一直有问题,哪位大侠帮忙看看啊,主要是看看我的读写函数哪儿有问题,谢了!下面是源程序:
unsigned char read_sja1000(unsigned char add)
{
unsigned char data;
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DATA(WR_N_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(CS_N_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(RD_N_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DIRECTION(CAN_AD_BASE, 1); //置为输出
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 1); //置ALE为高电平
IOWR_ALTERA_AVALON_PIO_DATA(CAN_AD_BASE, add);
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 0); //置ALE为低电平
IOWR_ALTERA_AVALON_PIO_DIRECTION(CAN_AD_BASE, 0); //置为输入
IOWR_ALTERA_AVALON_PIO_DATA(CS_N_BASE, 0); //置CS为低电平
IOWR_ALTERA_AVALON_PIO_DATA(RD_N_BASE, 0); //置RD为低电平
data=IORD_ALTERA_AVALON_PIO_DATA(CAN_AD_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(RD_N_BASE, 0); //置RD为低电平
IOWR_ALTERA_AVALON_PIO_DATA(RD_N_BASE, 1); //置RD为高电平
IOWR_ALTERA_AVALON_PIO_DATA(CS_N_BASE, 1); //置CS为高电平
return(data);
}
void write_sja1000(unsigned char add,unsigned char data)
{
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DATA(WR_N_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(CS_N_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DATA(RD_N_BASE, 1);
IOWR_ALTERA_AVALON_PIO_DIRECTION(CAN_AD_BASE, 1); //置为输出
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 1); //置ALE为高电平
IOWR_ALTERA_AVALON_PIO_DATA(CAN_AD_BASE, add);
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 0); //置ALE为低电平
IOWR_ALTERA_AVALON_PIO_DATA(CS_N_BASE, 0); //置CS为低电平
IOWR_ALTERA_AVALON_PIO_DATA(WR_N_BASE, 0); //置WR低电平
IOWR_ALTERA_AVALON_PIO_DATA(CAN_AD_BASE, data);
IOWR_ALTERA_AVALON_PIO_DATA(WR_N_BASE, 0); //置WR低电平
IOWR_ALTERA_AVALON_PIO_DATA(WR_N_BASE, 1); //置WR为高电平
IOWR_ALTERA_AVALON_PIO_DATA(CS_N_BASE, 1); //置CS为高电平
IOWR_ALTERA_AVALON_PIO_DATA(ALE_BASE, 1); //置ALE为高电平
}
void sja1000_init(void)
{
unsigned char can_status;
IOWR_ALTERA_AVALON_PIO_DATA(RST_N_BASE, 0);
IOWR_ALTERA_AVALON_PIO_DATA(RST_N_BASE, 1);
write_sja1000(CAN_IER,0x00); //禁止CAN中断
write_sja1000(CAN_MOD,0x09); //复位模式,单验收滤波器
can_status=read_sja1000(CAN_MOD); //读CAN的模式寄存器
while((can_status&0x01)==0x00) //判断是否进入复位模式
{
write_sja1000(CAN_MOD,0x09); //复位模式,单验收滤波器
can_status = read_sja1000(CAN_MOD);
}
write_sja1000(CAN_CDR,0xC8); //peliCAN,禁止时钟输出
write_sja1000(CAN_ACR0,CAN_ACR0_CZ); //验收码0
write_sja1000(CAN_ACR1,CAN_ACR1_CZ); //验收码1
write_sja1000(CAN_ACR2,CAN_ACR2_CZ); //验收码2
write_sja1000(CAN_ACR3,CAN_ACR3_CZ); //验收码3
write_sja1000(CAN_AMR0,CAN_AMR0_CZ); //屏蔽码0
write_sja1000(CAN_AMR1,CAN_AMR1_CZ); //屏蔽码1
write_sja1000(CAN_AMR2,CAN_AMR2_CZ); //屏蔽码2
write_sja1000(CAN_AMR3,CAN_AMR3_CZ); //屏蔽码3
write_sja1000(CAN_BTR0,0x01); //同步跳转3个周期,CAM系统时钟=4倍晶振振荡周期