1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > fpga初始化错误_关于用FPGA对sja1000进行初始化的有关问题

fpga初始化错误_关于用FPGA对sja1000进行初始化的有关问题

时间:2021-01-07 22:07:56

相关推荐

fpga初始化错误_关于用FPGA对sja1000进行初始化的有关问题

关于用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倍晶振振荡周期

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。