raoxianbin 发表于 2014-2-26 14:33

2812外扩SJA1000

如题,我在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;
}



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







zhangmangui 发表于 2014-2-26 21:39

顶一下没问过

raoxianbin 发表于 2014-2-28 12:17

有做过相关的前辈没?

玄德 发表于 2014-3-2 22:03


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

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


raoxianbin 发表于 2014-3-3 09:41

本帖最后由 raoxianbin 于 2014-3-3 09:44 编辑

玄德 发表于 2014-3-2 22:03 https://bbs.21ic.com/static/image/common/back.gif
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
#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
#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
#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         //测试寄存器
#define SJA_TEST_ADR    (SJA_BASE_ADR + 0x09)
/********************************
* #define SJA_10   XBYTE   寄存器功能保留
********************************/

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

//#define SJA_AMR0   XBYTE                //验收屏蔽0寄存器
#define SJA_AMR0_ADR    (SJA_BASE_ADR + 0x14)
//#define SJA_AMR1   XBYTE                //验收屏蔽1寄存器
#define SJA_AMR1_ADR    (SJA_BASE_ADR + 0x15)
//#define SJA_AMR2   XBYTE                //验收屏蔽2寄存器
#define SJA_AMR2_ADR    (SJA_BASE_ADR + 0x16)
//#define SJA_AMR3   XBYTE                //验收屏蔽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
#define SJA_RBSR1    XBYTE
#define SJA_RBSR2    XBYTE
#define SJA_RBSR3    XBYTE
#define SJA_RBSR4    XBYTE
#define SJA_RBSR5    XBYTE
#define SJA_RBSR6    XBYTE
#define SJA_RBSR7    XBYTE
#define SJA_RBSR8    XBYTE
#define SJA_RBSR9    XBYTE
#define SJA_RBSR10   XBYTE
#define SJA_RBSR11   XBYTE
#define SJA_RBSR12   XBYTE

#define SJA_RMC      XBYTE         //RX 信息计数器 寄存器
#define SJA_RBSA   XBYTE            //RX 缓冲区起始地址 寄存器
*/
/**********************
时钟分频寄存器地址定义
************************/
//#define SJA_CDR       XBYTE               //时钟分频 寄存器
#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



麻烦帮我看看谢谢了

玄德 发表于 2014-3-3 11:27

说实话,别人一般不会去读你的程序。提问者有这个期待,但很难如愿。

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

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

raoxianbin 发表于 2014-3-3 12:43

玄德 发表于 2014-3-3 11:27 static/image/common/back.gif
说实话,别人一般不会去读你的程序。提问者有这个期待,但很难如愿。

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

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

yangjiaoshai 发表于 2014-4-12 13:06

搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码

raoxianbin 发表于 2014-4-12 13:16

yangjiaoshai 发表于 2014-4-12 13:06 static/image/common/back.gif
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...

恩之前搞定了

yangjiaoshai 发表于 2014-4-12 13:19

楼主你碰到过F4错误代码吗,是片子问题还是时钟频率不对?

13629754032 发表于 2017-9-4 10:42

yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...

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

13629754032 发表于 2017-9-5 13:21

yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...

你好,我想问下,SR为0XF4解决了吗?怎么解决的?我也遇到相同的问题了。
页: [1]
查看完整版本: 2812外扩SJA1000