首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于用FPGA对sja1000进行初始化的有关问题

2012-08-08 
关于用FPGA对sja1000进行初始化的问题我用pio口与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倍晶振振荡周期


  write_sja1000(CAN_BTR1,0x1C); //采样点3,段一6,段二3 此两位设置通讯波特率
   
  write_sja1000(CAN_OCR,0x1A); //输出控制寄存器
  write_sja1000(CAN_MOD,0x08); //进入工作模式,单验收滤波器
  can_status=read_sja1000(CAN_MOD); //读CAN的模式寄存器
   
  while((can_status&0x01)==0x01)
  {
  write_sja1000(CAN_MOD,0x08); //进入工作模式,单验收滤波器
  can_status=read_sja1000(CAN_MOD); //读CAN的模式寄存器
  }
  write_sja1000(CAN_IER,0x01); //开接收中断 
}



[解决办法]
怎么没人回答啊 我也想知道。

热点排行
Bad Request.