打印
[DSP编程]

2812外扩SJA1000

[复制链接]
2440|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如题,我在2812芯片外围外扩了2片sja1000,但是在编写代码的过程中没有实现相应的功能,贴出来让大家帮忙看看

一下是原理图


SJA1000是一款地址/数据分时复用的芯片,我把他外扩在外部接口0上


现在的问题是我想操作一个寄存器,能不能用下面的代码实现呢?

比如**作地址0的寄存器  也就是0x2000

先通过宏
#define SJA_BASE_ADR     0x2000         //寄存器地址的基址
#define SJA_BASE_ADR_PTR   *(volatile unsigned short int *)(SJA_BASE_ADR)  
选好基址


以下是写的子函数

void Wr_SJA1_CMD ( Uint16 Wr_ADR )
{
//INTEL MODE,SJACS1=GPIOD0;SJA_ALE1=GPIOD1 ;SJACS2=GPIOA11;SJA_ALE2=GPIOA12
//GPIOD0=CS1,GPIOD1 =ALE1
      GpioDataRegs.GPDCLEAR.bit.GPIOD0= 1;  //CS1=GPIOD0,164245需要OE
      GpioDataRegs.GPDSET.bit.GPIOD1  = 1;  //WRITE ADRESS   ALE1 =1=GPIOD1
          SJA_BASE_ADR_PTR= Wr_ADR;               //先送出地址,ALE=1
             GpioDataRegs.GPDCLEAR.bit.GPIOD1 = 1;  //WRITE ADRESS   ALE1 CLEAR
         GpioDataRegs.GPDSET.bit.GPIOD0    =1;  //WRITE ADRESS SJA1

          GpioDataRegs.GPDCLEAR.bit.GPIOD0= 1;  //CS1
          SJA_BASE_ADR_PTR= SJA_Wr_CMD;//按照地址写入状态信息                                                                                //然后再读数据,ALE0,CS=0,RD=0                       
      GpioDataRegs.GPDSET.bit.GPIOD0=1     ;//WRITE ADRESS SJA2
}



再就是读的子程序


Uint8 Read_SJA1_Status ( Uint16 Read_ADR )
{
      //INTEL MODE
       
      GpioDataRegs.GPDCLEAR.bit.GPIOD0= 1;  //CS1=GPIOD0,164245需要OE
      GpioDataRegs.GPDSET.bit.GPIOD1  = 1;  //WRITE ADRESS   ALE1 =1=GPIOD1
          SJA_BASE_ADR_PTR= Read_ADR;               //先送出地址,ALE=1
             GpioDataRegs.GPDCLEAR.bit.GPIOD1 = 1;  //WRITE ADRESS   ALE1 CLEAR
          GpioDataRegs.GPDSET.bit.GPIOD0    =1;  //WRITE ADRESS SJA1
          
          GpioDataRegs.GPDCLEAR.bit.GPIOD0= 1;  //CS1
      SJA1_Status=SJA_BASE_ADR_PTR;//按照地址读出状态信息                                                                                //然后再读数据,ALE0,CS=0,RD=0                       
      GpioDataRegs.GPDSET.bit.GPIOD0=1     ;//READ ADRESS SJA1
          return SJA1_Status;
}



但是我发现,我读回来的数据不是我写进去的数据,不知道是编程的想法错了还是什么原因,请大家帮忙看看







shixu2.jpg (45.27 KB )

时序图

时序图

shixu1.jpg (47.43 KB )

时序图

时序图

sja2.jpg (12.9 KB )

原理图2

原理图2

QQ截图sja1.jpg (115.98 KB )

原理图1

原理图1

相关帖子

沙发
zhangmangui| | 2014-2-26 21:39 | 只看该作者
顶一下  没问过

使用特权

评论回复
板凳
raoxianbin|  楼主 | 2014-2-28 12:17 | 只看该作者
有做过相关的前辈没?

使用特权

评论回复
地板
玄德| | 2014-3-2 22:03 | 只看该作者

Wr_ADR 和 Read_ADR,应当是SJA芯片内部存储器的地址,对吗?

如果是,那么操作的时候,加偏移了没有?


使用特权

评论回复
5
raoxianbin|  楼主 | 2014-3-3 09:41 | 只看该作者
本帖最后由 raoxianbin 于 2014-3-3 09:44 编辑
玄德 发表于 2014-3-2 22:03
Wr_ADR 和 Read_ADR,应当是SJA芯片内部存储器的地址,对吗?

如果是,那么操作的时候,加偏移了没有?


是的  偏移地址我是加了的

这是我头文件


#ifndef __SJAPELICAN_H__
#define __SJAPELICAN_H__
#include "DSP28_Device.h"

#define Fclk      12000000UL                 /*使用11.0592M晶体*/
#define BAUD      9600UL                     /*波特率定义为9600*/







#define SJA_BASE_ADR     0x2000         //寄存器地址的基址
#define SJA_BASE_ADR_PTR   *(volatile unsigned short int *)(SJA_BASE_ADR)


//SJA1000寄存器地址定义,作用在Peli模式,扩展帧方式
/**********************
模式控制寄存器及其位定义
************************/
#define SJA_MOD_ADR   (SJA_BASE_ADR + 0x00)


#define RM_BIT     0x01  //复位模式请求位
#define LOM_BIT    0x02  //只听模式位
#define STM_BIT    0x04  //自检模式位
#define AFM_BIT    0x08  //验收滤波器模式位
#define SM_BIT     0x10  //睡眠模式位

/**********************
命令寄存器及其位定义
************************/
#define SJA_CMR_ADR   (SJA_BASE_ADR + 0x01)
#define TR_BIT         0x01       //发送请求位
#define AT_BIT         0x02        //中止发送位
#define RRB_BIT        0x04        //释放接收缓冲器位
#define CDO_BIT        0x08        //清除数据溢出位
#define SRR_BIT        0x10        //自身接收请求位

/**********************
状态寄存器及其位定义
************************/
//#define SJA_SR     XBYTE[SJA_BASE_ADR + 0x02]
#define SJA_SR_ADR    (SJA_BASE_ADR + 0x02)
#define RBS_BIT           0x01                    //接收缓冲器状态位
#define DOS_BIT           0x02                     //数据溢出状态位
#define TBS_BIT           0x04                      //发送缓冲器状态位
#define TCS_BIT           0x08                      //发送完成状态位
#define RS_BIT            0x10                    //接收状态位
#define TS_BIT            0x20                     //发送状态位
#define ES_BIT            0x40                   //错误状态位
#define BS_BIT            0x80                    //总线状态位

/**********************
中断寄存器及其位定义
************************/
//#define SJA_IR     XBYTE[SJA_BASE_ADR + 0x03]
#define SJA_IR_ADR    (SJA_BASE_ADR + 0x03)
#define RI_BIT            0x01                     //接收中断位
#define TI_BIT            0x02                      //发送中断位
#define EI_BIT            0x04                      //错误警告中断位
#define DOI_BIT           0x08                     //数据溢出中断位
#define WUI_BIT           0x10                      //唤醒中断位
#define EPI_BIT           0x20                      //错误消极中断位
#define ALI_BIT           0x40                     //仲裁丢失中断位
#define BEI_BIT           0x80                    //总线错误中断位

/**********************
中断使能寄存器及其位定义
************************/
//#define SJA_IER    XBYTE[SJA_BASE_ADR + 0x04]
#define SJA_IER_ADR    (SJA_BASE_ADR + 0x04)
#define RIE_BIT           0x01                     //接收中断使能位
#define TIE_BIT           0x02                      //发送中断使能位
#define EIE_BIT           0x04                      //错误警告中断使能位
#define DOIE_BIT          0x08                      //数据溢出中断使能位
#define WUIE_BIT          0x10                      //唤醒中断使能位
#define EPIE_BIT          0x20                      //错误消极中断使能位
#define ALIE_BIT          0x40                      //仲裁丢失中断使能位
#define BEIE_BIT          0x80                     //总线错误中断使能位


#define SJA_BTR0_ADR    (SJA_BASE_ADR + 0x06)
#define SJA_BTR1_ADR    (SJA_BASE_ADR + 0x07)
#define SAM_BIT           0x00   //0x80    采样模式位;>100k=0=总线被采样1次;1== 总线被采样3次
/**********************
输出控制寄存器及其位定义
************************/
#define SJA_OCR_ADR    (SJA_BASE_ADR + 0x08)
           /*OCMODE1 ,OCMODE0 */
#define BiPhaseMode       0x00                      //双相输出模式
#define NormalMode        0x02                  //正常输出模式
#define ClkOutMode        (0x01|0x02)       //时钟输出模式
           /*TX1 的输出管脚配置*/
#define OCPOL1_BIT        0x20                  //输出极性控制位
#define Tx1Float          0x00                      //配置为悬空
#define Tx1PullDn         0x40                  //配置为下拉
#define Tx1PullUp         0x80                 //配置为上拉
#define Tx1PshPull        (0x40|0x80)       //配置为推挽
            /*TX0 的输出管脚配置*/
#define OCPOL0_BIT        0x04                      //输出极性控制位
#define Tx0Float          0x00                      //配置为悬空
#define Tx0PullDn         0x08                      //配置为下拉
#define Tx0PullUp         0x10                      //配置为上拉
#define Tx0PshPull        (0x10|0x08)                    //配置为推挽

//#define SJA_TEST   XBYTE[SJA_BASE_ADR + 0x09]         //测试寄存器
#define SJA_TEST_ADR    (SJA_BASE_ADR + 0x09)
/********************************
* #define SJA_10   XBYTE[SJA1_BASE_ADR + 0x0a]   寄存器功能保留
********************************/

/**********************
其他寄存器及其位定义
************************/
#define SJA_ALC_ADR    (SJA_BASE_ADR + 0x0b)
//#define SJA_ECC      XBYTE[SJA_BASE_ADR + 0x0c]                //错误捕捉寄存器
#define SJA_ECC_ADR    (SJA_BASE_ADR + 0x0c)
//#define SJA_EWLR     XBYTE[SJA_BASE_ADR + 0x0d]                //错误报警限制寄存器
#define SJA_EWLR_ADR    (SJA_BASE_ADR + 0x0d)
//#define SJA_RXERR    XBYTE[SJA_BASE_ADR + 0x0e]                //RX 错误计数器寄存器
#define SJA_RXERR_ADR    (SJA_BASE_ADR + 0x0e)
//#define SJA_TXERR    XBYTE[SJA_BASE_ADR + 0x0f]                //TX 错误计数器寄存器
#define SJA_TXERR_ADR    (SJA_BASE_ADR + 0x0f)
/**********************
验收滤波器寄存器及其位定义
************************/
//#define SJA_ACR0     XBYTE[SJA_BASE_ADR + 0x10]                //验收代码0寄存器
#define SJA_ACR0_ADR    (SJA_BASE_ADR + 0x10)
//#define SJA_ACR1     XBYTE[SJA_BASE_ADR + 0x11]                //验收代码1寄存器
#define SJA_ACR1_ADR    (SJA_BASE_ADR + 0x11)
//#define SJA_ACR2     XBYTE[SJA_BASE_ADR + 0x12]                //验收代码2寄存器
#define SJA_ACR2_ADR    (SJA_BASE_ADR + 0x12)
//#define SJA_ACR3     XBYTE[SJA_BASE_ADR + 0x13]                //验收代码3寄存器
#define SJA_ACR3_ADR    (SJA_BASE_ADR + 0x13)

//#define SJA_AMR0     XBYTE[SJA_BASE_ADR + 0x14]                //验收屏蔽0寄存器
#define SJA_AMR0_ADR    (SJA_BASE_ADR + 0x14)
//#define SJA_AMR1     XBYTE[SJA_BASE_ADR + 0x15]                //验收屏蔽1寄存器
#define SJA_AMR1_ADR    (SJA_BASE_ADR + 0x15)
//#define SJA_AMR2     XBYTE[SJA_BASE_ADR + 0x16]                //验收屏蔽2寄存器
#define SJA_AMR2_ADR    (SJA_BASE_ADR + 0x16)
//#define SJA_AMR3     XBYTE[SJA_BASE_ADR + 0x17]                //验收屏蔽3寄存器
#define SJA_AMR3_ADR    (SJA_BASE_ADR + 0x17)
/**********************
TX缓冲器地址定义
************************/
#define SJA_TBSR0_ADR    SJA_BASE_ADR + 0x10
#define SJA_TBSR1_ADR    SJA_BASE_ADR + 0x11
#define SJA_TBSR2_ADR    SJA_BASE_ADR + 0x12
#define SJA_TBSR3_ADR    SJA_BASE_ADR + 0x13
#define SJA_TBSR4_ADR    SJA_BASE_ADR + 0x14
#define SJA_TBSR5_ADR    SJA_BASE_ADR + 0x15
#define SJA_TBSR6_ADR    SJA_BASE_ADR + 0x16
#define SJA_TBSR7_ADR    SJA_BASE_ADR + 0x17
#define SJA_TBSR8_ADR    SJA_BASE_ADR + 0x18
#define SJA_TBSR9_ADR    SJA_BASE_ADR + 0x19
#define SJA_TBSR10_ADR   SJA_BASE_ADR + 0x1a
#define SJA_TBSR11_ADR   SJA_BASE_ADR + 0x1b
#define SJA_TBSR12_ADR   SJA_BASE_ADR + 0x1c

/**********************
RX缓冲器地址定义
************************/
#define SJA_RBSR0_ADR    SJA_BASE_ADR + 0x10
#define SJA_RBSR1_ADR    SJA_BASE_ADR + 0x11
#define SJA_RBSR2_ADR    SJA_BASE_ADR + 0x12
#define SJA_RBSR3_ADR    SJA_BASE_ADR + 0x13
#define SJA_RBSR4_ADR    SJA_BASE_ADR + 0x14
#define SJA_RBSR5_ADR    SJA_BASE_ADR + 0x15
#define SJA_RBSR6_ADR    SJA_BASE_ADR + 0x16
#define SJA_RBSR7_ADR    SJA_BASE_ADR + 0x17
#define SJA_RBSR8_ADR    SJA_BASE_ADR + 0x18
#define SJA_RBSR9_ADR    SJA_BASE_ADR + 0x19
#define SJA_RBSR10_ADR   SJA_BASE_ADR + 0x1a
#define SJA_RBSR11_ADR   SJA_BASE_ADR + 0x1b
#define SJA_RBSR12_ADR   SJA_BASE_ADR + 0x1c
#define SJA_RMC_ADR      SJA_BASE_ADR + 0x1d           //RX 信息计数器 寄存器
#define SJA_RBSA_ADR     SJA_BASE_ADR + 0x1e            //RX 缓冲区起始地址 寄存器

/*
#define SJA_RBSR0    XBYTE[SJA_BASE_ADR + 0x10]
#define SJA_RBSR1    XBYTE[SJA_BASE_ADR + 0x11]
#define SJA_RBSR2    XBYTE[SJA_BASE_ADR + 0x12]
#define SJA_RBSR3    XBYTE[SJA_BASE_ADR + 0x13]
#define SJA_RBSR4    XBYTE[SJA_BASE_ADR + 0x14]
#define SJA_RBSR5    XBYTE[SJA_BASE_ADR + 0x15]
#define SJA_RBSR6    XBYTE[SJA_BASE_ADR + 0x16]
#define SJA_RBSR7    XBYTE[SJA_BASE_ADR + 0x17]
#define SJA_RBSR8    XBYTE[SJA_BASE_ADR + 0x18]
#define SJA_RBSR9    XBYTE[SJA_BASE_ADR + 0x19]
#define SJA_RBSR10   XBYTE[SJA_BASE_ADR + 0x1a]
#define SJA_RBSR11   XBYTE[SJA_BASE_ADR + 0x1b]
#define SJA_RBSR12   XBYTE[SJA_BASE_ADR + 0x1c]

#define SJA_RMC      XBYTE[SJA_BASE_ADR + 0x1d]           //RX 信息计数器 寄存器
#define SJA_RBSA     XBYTE[SJA_BASE_ADR + 0x1e]            //RX 缓冲区起始地址 寄存器
*/
/**********************
时钟分频寄存器地址定义
************************/
//#define SJA_CDR       XBYTE[SJA_BASE_ADR + 0x1f]                 //时钟分频 寄存器
#define SJA_CDR_ADR     SJA_BASE_ADR + 0x1f
#define CLKOff_BIT        0x08                     //时钟关闭位,时钟输出管脚控制位
#define RXINTEN_BIT       0x20                      //用于接收中断的管脚TX1
#define CBP_BIT           0x40                      //CAN 比较器旁路控制位
#define CANMode_BIT       0x80                     //CAN 模式控制位

#endif



麻烦帮我看看  谢谢了

使用特权

评论回复
6
玄德| | 2014-3-3 11:27 | 只看该作者
说实话,别人一般不会去读你的程序。提问者有这个期待,但很难如愿。

原因:1、大家都忙;2、要费脑筋;3、牵扯到具体芯片。

有示波器吗?用示波器是个好习惯,对发现问题很有帮助。

使用特权

评论回复
7
raoxianbin|  楼主 | 2014-3-3 12:43 | 只看该作者
玄德 发表于 2014-3-3 11:27
说实话,别人一般不会去读你的程序。提问者有这个期待,但很难如愿。

原因:1、大家都忙;2、要费脑筋;3 ...

示波器是肯定有的,恩,我自己慢慢搞定吧    谢谢了

使用特权

评论回复
8
yangjiaoshai| | 2014-4-12 13:06 | 只看该作者
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码

使用特权

评论回复
9
raoxianbin|  楼主 | 2014-4-12 13:16 | 只看该作者
yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...

恩  之前搞定了

使用特权

评论回复
10
yangjiaoshai| | 2014-4-12 13:19 | 只看该作者
楼主你碰到过F4错误代码吗,是片子问题还是时钟频率不对?

使用特权

评论回复
11
13629754032| | 2017-9-4 10:42 | 只看该作者
yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...

我想请问一下,你这个OxF4错误是怎么解决的?我也遇到相同情况了

使用特权

评论回复
12
13629754032| | 2017-9-5 13:21 | 只看该作者
yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...

你好,我想问下,SR为0XF4解决了吗?怎么解决的?我也遇到相同的问题了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

244

帖子

1

粉丝