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;
}
但是我发现,我读回来的数据不是我写进去的数据,不知道是编程的想法错了还是什么原因,请大家帮忙看看
顶一下没问过 有做过相关的前辈没?
Wr_ADR 和 Read_ADR,应当是SJA芯片内部存储器的地址,对吗?
如果是,那么操作的时候,加偏移了没有?
本帖最后由 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
麻烦帮我看看谢谢了 说实话,别人一般不会去读你的程序。提问者有这个期待,但很难如愿。
原因:1、大家都忙;2、要费脑筋;3、牵扯到具体芯片。
有示波器吗?用示波器是个好习惯,对发现问题很有帮助。
玄德 发表于 2014-3-3 11:27 static/image/common/back.gif
说实话,别人一般不会去读你的程序。提问者有这个期待,但很难如愿。
原因:1、大家都忙;2、要费脑筋;3 ...
示波器是肯定有的,恩,我自己慢慢搞定吧 谢谢了 搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 yangjiaoshai 发表于 2014-4-12 13:06 static/image/common/back.gif
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...
恩之前搞定了 楼主你碰到过F4错误代码吗,是片子问题还是时钟频率不对? yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...
我想请问一下,你这个OxF4错误是怎么解决的?我也遇到相同情况了 yangjiaoshai 发表于 2014-4-12 13:06
搞定没有,我也是用2812扩的两片SJA1000,操作寄存器没问题,就是发送数据是,SR是0XF4错误代码 ...
你好,我想问下,SR为0XF4解决了吗?怎么解决的?我也遇到相同的问题了。
页:
[1]