4130|4

7

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于opencore里下载的CAN IP的寄存器读写问题 [复制链接]

这件事情起源于毕业设计,真是坑爹的毕业设计。。。。。。。。

 

最先的想法是在FPGA内集成一个CAN控制器,然后通过读写它来对外部的传感器数据进行采集。。。。。

 

第一步:新建Quartus II工程,如图所示:

在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啊!!!!!想不通啊!!!

 

此帖出自FPGA/CPLD论坛
点赞 关注
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己先顶上去!!
此帖出自FPGA/CPLD论坛
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不要沉下去啊,哪位大侠来看看!!!!
此帖出自FPGA/CPLD论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

4
 
为什么没人来顶?
此帖出自FPGA/CPLD论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

5
 
只好自己顶了!!
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表