关于opencore里下载的CAN IP的寄存器读写问题

2019-03-25 09:26发布

这件事情起源于毕业设计,真是坑爹的毕业设计。。。。。。。。   最先的想法是在FPGA内集成一个CAN控制器,然后通过读写它来对外部的传感器数据进行采集。。。。。   第一步:新建Quartus II工程,如图所示: 1.jpg 在SOPC利用PIO内核直接对CAN控制器进行数据的读取,想法挺简单,实施却难啊。。。。   第二步:在IDE环境中编程,在IDE中编程相关的CAN控制器的读写代码,问题来了   首先是CAN控制器的初始化: void CAN_IO_init()
{
    ALE_CLR;
    WR_SET;
    RD_SET;
    CS_SET;
    AD_OUT;  //首先确定PIO_AD口是数据输出口
}   然后是两个最为关键的寄存器读写子函数,也就是这两个子函数,让我头疼了两个星期,先来看读子函数,在看子函数之前,先来看相关的宏定义:   #define   ALE_SET   IOWR_ALTERA_AVALON_PIO_DATA(PIO_ALE_BASE, 1)   //ALE
#define   ALE_CLR   IOWR_ALTERA_AVALON_PIO_DATA(PIO_ALE_BASE, 0)   #define   WR_SET    IOWR_ALTERA_AVALON_PIO_DATA(PIO_WR_BASE, 1)    //WR
#define   WR_CLR    IOWR_ALTERA_AVALON_PIO_DATA(PIO_WR_BASE, 0)   #define   RD_SET    IOWR_ALTERA_AVALON_PIO_DATA(PIO_RD_BASE, 1)    //RD
#define   RD_CLR    IOWR_ALTERA_AVALON_PIO_DATA(PIO_RD_BASE, 0)   #define   CS_SET    IOWR_ALTERA_AVALON_PIO_DATA(PIO_CS_BASE, 1)    //CS
#define   CS_CLR    IOWR_ALTERA_AVALON_PIO_DATA(PIO_CS_BASE, 0)   #define   AD_WR(data)   IOWR_ALTERA_AVALON_PIO_DATA(PIO_AD_BASE, data)   //AD
#define   AD_RD         IORD_ALTERA_AVALON_PIO_DATA(PIO_AD_BASE)   #define   AD_IN     IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_AD_BASE, 0)     //AD_DIR
#define   AD_OUT    IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_AD_BASE, 0xFF)      以上这些都是直接对IO口进行操作,进行简单的置位与复位   //------------------------------------------------------------------------------------------------------
// 函数类别 SJA1000基本操作
// 函数名称 CANREG_read
// 入口函数 addr
// 出口函数 data
// 函数功能 读SJA1000的寄存器
//------------------------------------------------------------------------------------------------------
alt_u8 CANREG_read(alt_u8 addr)
{
    alt_u8 data;
    ALE_CLR;
    WR_SET;
    RD_SET;
    CS_SET;
    AD_OUT;    //再次初始化
    ALE_SET;
    delay(1);
    AD_WR(addr);
    delay(1);
    ALE_CLR;
    delay(1);   //先送地址
    AD_IN;    //改变AD_PIO的方向,变为读取口
    delay(1);
    CS_CLR;
    RD_CLR;
    delay(2);
    data=AD_RD;    //读取数据
    RD_SET;
    CS_SET;
    AD_OUT;
    return(data);
}   接下来是写寄存器子函数:   //------------------------------------------------------------------------------------------------------
// 函数类别 SJA1000基本操作
// 函数名称 CANREG_write
// 入口函数 addr,data
// 出口函数 无
// 函数功能 写SJA1000的寄存器
//------------------------------------------------------------------------------------------------------
void CANREG_write(alt_u8 addr, alt_u8 data)
{
    ALE_CLR;
    WR_SET;
    RD_SET;
    CS_SET;
    AD_OUT; //确保AD为数据输出模式
    ALE_SET;
    delay(1);
    AD_WR(addr);
    delay(1);
    ALE_CLR;   //先送地址
    delay(1);
    CS_CLR;
    WR_CLR;
    delay(1);
    AD_WR(data);  //再写数据
    WR_SET;
    delay(1);
    CS_SET;
    delay(1);
    ALE_SET;
}     可是当我往测试寄存器进行读写测试的时候,无论写进去的数据是什么,读出来的永远都是0xff,下面是测试寄存器的读写函数:   //------------------------------------------------------------------------------------------------------
// 函数类别   SJA1000基本操作
// 函数名称   SJAconnect_judge
// 入口函数   无
// 出口函数   无
// 全局变量   connect_OK
// 操作寄存器 测试寄存器(地址09)
// 函数功能   判断SJA1000与控制器连接是否正常
//------------------------------------------------------------------------------------------------------
void SJAconnect_judge(void)
{
    CANREG_write(0x09,0x55);                //写AA到测试寄存器(地址09)
    if(CANREG_read(0x09)==0x55)
    {
        connect_OK=1;                         //连接正常 
    }
    else 
    {
        connect_OK=0;                         //连接故障
    }
}   哎,我实在是没有办法了,请各位大侠给我看看,到底问题出在何方,小弟感激不尽!!!!!!为什么读出来的数据永远都是0xff啊!!!!!想不通啊!!!   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
心情绿茶
1楼-- · 2019-03-25 17:20
 精彩回答 2  元偷偷看……
心情绿茶
2楼-- · 2019-03-25 18:37
不要沉下去啊,哪位大侠来看看!!!!
心情绿茶
3楼-- · 2019-03-25 19:20
为什么没人来顶?
心情绿茶
4楼-- · 2019-03-25 23:02
只好自己顶了!!

一周热门 更多>