fpga初始化错误_关于用FPGA对sja1000进行初始化的有关问题
關(guān)于用FPGA對(duì)sja1000進(jìn)行初始化的問(wèn)題
我用pio口與sja1000的各引腳相連,初始化的時(shí)候讀寫(xiě)一直有問(wèn)題,哪位大俠幫忙看看啊,主要是看看我的讀寫(xiě)函數(shù)哪兒有問(wèn)題,謝了!下面是源程序:
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); //復(fù)位模式,單驗(yàn)收濾波器
can_status=read_sja1000(CAN_MOD); //讀CAN的模式寄存器
while((can_status&0x01)==0x00) //判斷是否進(jìn)入復(fù)位模式
{
write_sja1000(CAN_MOD,0x09); //復(fù)位模式,單驗(yàn)收濾波器
can_status = read_sja1000(CAN_MOD);
}
write_sja1000(CAN_CDR,0xC8); //peliCAN,禁止時(shí)鐘輸出
write_sja1000(CAN_ACR0,CAN_ACR0_CZ); //驗(yàn)收碼0
write_sja1000(CAN_ACR1,CAN_ACR1_CZ); //驗(yàn)收碼1
write_sja1000(CAN_ACR2,CAN_ACR2_CZ); //驗(yàn)收碼2
write_sja1000(CAN_ACR3,CAN_ACR3_CZ); //驗(yàn)收碼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); //同步跳轉(zhuǎn)3個(gè)周期,CAM系統(tǒng)時(shí)鐘=4倍晶振振蕩周期
總結(jié)
以上是生活随笔為你收集整理的fpga初始化错误_关于用FPGA对sja1000进行初始化的有关问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ¤转 Mysql双机热备实现
- 下一篇: CentOS7安装MariaDB的流程步