DM6467没有自带的CAN总线控制器,不过有SPI控制器,所以要使用CAN总线的话可以用MCP2510芯片实现SPI总线到CAN总线的转换。总线转换电路如下所示。

对于CAN总线模块的测试需要先测试SPI模块,然后测试MCP2510部分。DM6467的SPI模块自带回环模式(loop-backmode),可以自发自收,对于测试比较方便。并且MCP2510也自带回环模式,也可以测试发送和接收。所以我们的测试过程是:

1,  初始化SPI模块,置为回环模式,测试收发数据。

2,  设置SPI模块为正常工作模式,配置MCP2510为回环模式,测试数据收发。

3,  用SPI配置MCP2510为正常工作模式,测试CAN总线上的波形。

1        SPI回环测试

对于SPI总线协议这里不做介绍,只讲DM6467中SPI模块初始化的步骤。

1,  置寄存器CPIGCR0=0以复位SPI模块,然后置SPIGCR0=1使能SPI模块,开始配置。

2,  配置SPIGCR1为loop-back模式,DM6467为SPI主设备,使用内部时钟(SYSCLK3)。

3,  配置SPIPC0选择我们使用了的四根SPI线:MISO,MOSI,CS0和CLK。

4,  配置SPIFMT,选择传输字长为1个字节,至于时钟相序的搭配需根据MCP2510的实际情况来配置,将在下一部分介绍,在回环模式时可以使用任意格式。

5,  配置SPIDAT1选择CS0。

6,  置SPIGCR1的第24位为1,使SPI处于工作状态。

具体的配置代码如下所示:

void SPI_init(void)

{

SPIGCR0 = 0;

_waitmsec(100);

SPIGCR0 = 1;

_waitmsec(100);

SPIGCR1 = 0 | (1 << 16) | (1 << 1) | (1 << 0); // loop-back; master; internal clock

SPIPC0 = 0 | (1 << 11) | (1 << 10) | (1 << 9) | 1; // SOMI, SIMO, CLK, CS0

SPIFMT0 = 0 | (0x3f << 24) | (1 << 17)  | (0xff << 8) | 8; //word length: 8-bit

SPIDAT1 = 0 | (2 << 16); // CS0 selected

SPIGCR1 = SPIGCR1 | (1 << 24); // activate spi

}

完成初始化配置后,需要接收和发送数据。接收和发送数据都比较简单,主要方法就是根据中断寄存器来判断数据是否发送完毕或者接收缓冲区是否接到数据。

实现SPI接收数据的代码如下:

while(SPIBUF & (1 << 31)); // exit when RXEMPTY=0

temp = 0xff & SPIBUF;

实现SPI发送数据的代码如下:

SPIDAT1 = 0 | (2 << 16) | (data & 0xff);

while(SPIBUF & (1 << 29)); // TXFULL=0

接下来就可以测试SPI模块自发自收数据的过程了,使用以下代码实现:

SPI_TX(0xa9);

_waitmsec(100);

reg = SPI_RX();

运行后显示reg为0xa9,表示SPI模块能够正常工作。

2        MCP2510回环测试

开始测试MCP2510部分之前需要将SPI模块设置为正常工作模式,这只需要将SPIGCR1的第16位置为0即可。

然后需要配置SPI模块的时序。在MCP2510中对发送和接收数据的相序有明确要求,MCP2510发送数据的时序和接收数据的时序分别为:

根据MCP2510的芯片手册,我们需要配置DM6467SPI模块的SPIFMT寄存器为:polarity = 1;phase = 0。这种配置模式下SPI模块的时序如下所示:

在配置好之后就可以测试SPI模块的输出波形了,验证是否符合MCP2510的要求。使用示波器捕捉到SPI发数据时CLK引脚与MOSI引脚的波形如下所示:

发送数据时CLK引脚和CS0引脚的波形如下所示:

通过以上两张图片显示的波形我们可以得知SPI模块的输出波形是符合MCP2510要求的,所以能够与MCP2510进行正常通讯。

接下来需要配置MCP2510的寄存器,配置的步骤包括:

1,  向MCP2510发送reset命令,复位该芯片。

2,  配置CANCTRL寄存器,REQOP[2:0]=100b,即配置模式。

3,  配置CNF1、CNF2和CNF3,设定波特率。

4,  配置发送缓冲器,设置ID、优先级、数据长度等参数。

5,  配置接收缓冲器,设置ID、接收模式等,可以选择配置接收滤波器。

6,  配置CANCTRL,REQOP[2:0]=010b,即回环模式。

MCP2510的初始化代码如下所示:

void MCP2510_init(void)

{

MCP2510_reset(); // reset mcp2510

MCP2510_WriteOneByte(CANCTRL, 0x80); // REQOP[2:0] = 100b: configuration mode

MCP2510_WriteOneByte(CNF1, 0x01); // set baudrate

MCP2510_WriteOneByte(CNF2, 0xae);

MCP2510_WriteOneByte(CNF3, 0x05);

MCP2510_WriteOneByte(TXB0CTRL, 0x00); // lowest priority

MCP2510_WriteOneByte(TXB0SIDH, 0x00); // identifier bits: 0000 0000 110 b

MCP2510_WriteOneByte(TXB0SIDL, 0xc0); // standard identifier

MCP2510_WriteOneByte(TXB0EID8, 0x00);

MCP2510_WriteOneByte(TXB0EID0, 0x00);

MCP2510_WriteOneByte(TXB0DLC, 0x01); // data frame; data field length: one byte

MCP2510_WriteOneByte(RXB0CTRL, 0x60); // receive all messages; rollover disabled; RXF0

MCP2510_WriteOneByte(RXF0SIDH, 0x00); // identifier bits: 0000 0000 110b

MCP2510_WriteOneByte(RXF0SIDL, 0xc0);

MCP2510_WriteOneByte(RXF0EID8, 0x00);

MCP2510_WriteOneByte(RXF0EID0, 0x00);

//MCP2510_WriteOneByte(CANCTRL, 0x47); // REQOP[2:0] = 010b: loopback mode; clock out enable; 1/8 Fclkout

_waitmsec(10);

}

void MCP2510_WriteOneByte(Uint8 addr, Uint8 data)

{

SPI_TX(MCP2510CMD_WRITE);

SPI_TX(addr);

SPI_TX(data);

SPIPC2 = SPIPC2 | 0x3;

_waitmsec(1);

}

接下来编写发送CAN报文的函数。暂时我们设置的报文数据域长度为1,即只发送一个字节。发送之前需要将数据写到发送缓冲寄存器,然后置TXB0CTRL.TXREQ位为1即可,代码如下所示:

void CAN_TXOneByte(Uint8 data)

{

MCP2510_WriteOneByte(0x36, data);

MCP2510_WriteOneByte(TXB0CTRL, 0x0d); // request to send data; highest priority

}

最后,在主程序中通过以下代码来实现回环测试。

CAN_TXOneByte(0xa9); // data: 0xa9

reg = MCP2510_ReadOneByte(RXB0D0);

printf("reg = 0x%2.2x\n", reg);

运行代码,输出reg=0xa9,表示MCP2510回环测试成功。

3        MCP2510正常工作

要使MCP2510正常工作,只需在原来的初始化代码基础上修改CANCTRL的REQOP[2:0]为000b。然后运行程序,在总线上测试CAN报文的发送情况。

由于现在没有从设备,所以每次的发送都是失败,CAN控制器会一直发送报文,这也方便了测试。使用示波器测得CAN总线上CANH和CANL两根线上的波形如下所示:

DM6467的CAN模块调试(SPI转CAN)相关推荐

  1. Lora模块调试记录

    一.Lora模块调试启动过程调试 1.Lora主程序启动 这个报错主要是GPS模块使用了另外一路的spi,在检查spi的模式.速率等等时候报错.目前没有GPS模块所以不影响正常运行情况下的报错信息忽略 ...

  2. Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项

    用户地址检测 简单模块调试 以及一些杂项 检测用户空间地址的有效性 上一节中提到在read write时候要检测用户空间传递的参数地址是否是有效地址,有的内核函数会自行检测,但是在调用轻量级的内核函数 ...

  3. 你所不知道的模块调试技巧 - npm link #17

    你所不知道的模块调试技巧 - npm link #17 1. 背景 node 应用开发中,我们不可避免的需要使用或拆分为 npm 模块,经常遇到的一个问题是: 新开发或修改的 npm 模块,如何在项目 ...

  4. 第十三届蓝桥杯嵌入式备赛-STM32G431-基础模块调试①LED/LCD调试

    目录 0.前言 时钟设置 项目设置 1.功能要求 电路原理图 2.STM32Cubemx初始化 3.程序实现 LCD LED 编写LED灯亮灭的相关函数 LED关闭函数 LEDx开启函数 LEDx关闭 ...

  5. WIFI模块调试_RTL8189FTV

    WIFI模块调试记录 本文调试的模块是:BL_M8189FS6(必联的WIFI模块) 简单介绍: 该模块就是用的毛蟹的8189FTV(全程应该是:RTL8189FTV,和RTL8189ETV是有区别的 ...

  6. 联芯 1860平台 icn6211 mipi to RGB 转换芯片 调试 和 st7789 LCD调试spi 9bit 模式

    关键字:联芯科技,LC1860,LC186x,Chipone Technology,icn6211,mipi bridge,mipi to RGB,mipi转换芯片,RGB666,st7789,st7 ...

  7. hc-05蓝牙模块调试

    hc-05蓝牙模块调试 本文主要记录hc-05蓝牙模块调试的过程,包括hc-05蓝牙模块连线,驱动下载,hc-05蓝牙模块模式介绍,AT指令,串口调试以及与安卓手机app连接发送数据.(只列举了我在调 ...

  8. 【JDY-23蓝牙模块调试】

    JDY-23蓝牙模块调试 整体说明 工欲善其事,必先利其器(JDY23蓝牙模块的购买) 电路原理图的设计 原理图的设计 PCB的设计 手机APP的设计 主窗口设计 IO控制窗口 串口透传功能 视频及开 ...

  9. 龙尚U9507 4G模块调试小结

    最近在调U9507模块,调试一个模块,其主要步骤如下: 1.首先要查看其数据手册,看其工作电压,该模块工作电压为3.3~4.2V,要先用万用表测其供电电压是否正常(注要一定要达3.3V以上,因为有些模 ...

最新文章

  1. oracle asm dd命令,使用dd命令复制ASM磁盘的spfile
  2. html表单上传图片获取路径,asp.net获取HTML表单File中的路径的方法
  3. TColorToHex 与 HexToTColor
  4. windows os x linux,What languages are Windows, Mac OS X and Linux written in?
  5. 关于myeclipse输入法编程繁体的修正
  6. python3-numpy数组广播 和 np.tile 扩展数组
  7. github搜索技巧_和逛知乎、刷微博一样高效使用 GitHub
  8. 终于有人把赌徒谬误讲明白了
  9. c语言50个小程序,C语言50小程序.doc
  10. zabbix3.4 监控mysql 数据库连接数
  11. php 批量打印word pdf,Office批量打印精灵教程--Word、PDF、Excel、PPT批量打印
  12. 简单明了的java反射机制
  13. 经济数学模型matlab,经济数学模型
  14. 联想新服务器怎么装系统教程,联想小新重装win7系统的详细教程图解
  15. iOS Masonry详解mas_makeConstraints() 添加约束 mas_remakeConstraints() 移除之前的约束,重新添加新的约束 mas_updateConst
  16. C#生成含数字字母的随机字符串
  17. vscode上传项目代码到gitee中
  18. CSS - 网格布局(grid)
  19. Proteus基于51单片机通过PWM脉冲调制控制电机转速_按键与串口控制转速_电机转速可测
  20. 2016云计算大会PPT打包下载

热门文章

  1. Qt音视频开发27-Onvif设备搜索
  2. 预测身高c需语言,预测身高问题。不知哪出问题了,算出乱码。求解!
  3. 【笨方法学PAT】1116 Come on! Let's C (20 分)
  4. Web性能测试工具大全
  5. 宏基因组分析-基于组装
  6. c语言;文件名批量修改要求可以修改整个文件内文件名或后缀名自动,Python批量修改文件名...
  7. 计算机网络定义记不住,记不住是怎么回事?——记忆是个神奇的小东西
  8. ubuntu虚拟机与windows主机文件传输(命令行)
  9. shell的几个重要命令,主要参数,循环语句以及变量处理
  10. 豪拒60亿美元,天真的程序员CEO最终被自己的公司解雇