概述

​ HI-3593是一款ARINC429协议收发器芯片,和之前介绍的HI-3582芯片功能一样,该芯片支持两路接收和一路发送,其中每个接收机具有标签识别、32×32 FIFO和模拟线路接收机。不同的是HI-3593通信接口为SPI总线,可以减少MCU的硬件管脚负担,而且HI-3593片内集成DC/DC 转换器用于产生双极性ARINC 429差分电压以便直接驱动ARINC 429总线,就不用像HI-3582那样需要提供±10V信号,这样使电路设计更加简洁。

硬件设计

​ HI-3593硬件设计十分方便,电源方面只需要提供3.3V供电,外部提供1MHz的时钟信号。如果你像我一样不使用标签过滤器的话,除了SPI总线以外,MCU只需要使用RxINT、RxFLAG、TFULL这几个状态管脚即可。参考设计如下图:

寄存器配置

​ HI-3593通过SPI总线通信,使用的是SPI模式0,最高支持10MHz通信速率,对于ARINC429的通信速率来说已经绰绰有余了。HI-3593主要的寄存器有接收控制寄存器(0x10,0x24)、发送控制寄存器(0x08)、ACLK分频寄存器(0x38)和标志中断寄存器(0x34),基本上初始化这几个寄存器就可以正常通信了。

  • 接收控制寄存器

    ​根据以上寄存器位的描述,很多时候需要翻转接收到的429消息的LABEL,这时RFLIP就要置1。我们不需要过滤SD9/10信息,所以SDON设置为0。PARITY为1,使能奇偶校验。LABREC、PLON为0,不使能标签过滤。RATE为0,设置为429通信速率为高速,也就是100kbps。

  • 发送控制寄存器

    TFLIP和上面接收翻转功能一样,置1后发送时翻转Label数据。TMODE置1,只要数据有效就发送出去。SELFTEST是自测试位,置1后会内部收发自环。PARITY和RATE同上。

  • ACLK分频寄存器

    这里使用的是1MHz外部晶振,所以DIV设置位0x00

  • 标志中断寄存器

    可以通过RxFLAG和RxINT管脚来判断是否接收到有效数据。RxFLAG设置为0,这样FIFO内接收到有效数据后管脚会变高,当数据被完全读取后管脚又被拉低。RxINT同样设置为0,当接收到有效数据会产生一个高脉冲中断信号。RxFLAG管脚适合用轮询的方法判断FIFO是否有数据,RxINT适用于中断的方式接收数据。由于ARINC429速率并不高,所以本文采用的是轮询方式接收数据,通过查询RxFLAG管脚是否为高,来判断FIFO内是否接收到有效数据。

参考程序

本例程是结合上面寄存器配置,通过轮询的方式接收数据,寄存器初始化时采用了结构体位域的方式进行配置,这样更加方便直观的设置每一位寄存器。通信过程中发现了一个问题,就是我发送的数据和接收端接收到的数据正好高低位翻转了,现在还没找到具体原因,只能通过函数dataFlip先翻转了数据然后再发送,有知道具体原因的朋友可以留言告诉我一下。


#include "ARINC429.h"
#include "Hal.h"#define ARINC_SELF_TEST 0/*管脚定义*/
#define ARINC_TFULL_PIN  0x42
#define ARINC_TEMPTY_PIN 0x43
#define ARINC_R1FLAG_PIN 0x44
#define ARINC_R1INT_PIN  0x45
#define ARINC_R2FLAG_PIN 0x46
#define ARINC_R2INT_PIN  0x22
#define ARINC_RESET_PIN  0x47/*Regs定义*/
#define ARINC_SEND_CTRL_WREG  0x08
#define ARINC_SEND_CTRL_RREG  0x84
#define ARINC_FIFO_DATA_REG   0x0C
#define ARINC_RECV1_CTRL_WREG 0x10
#define ARINC_RECV1_CTRL_RREG 0x94
#define ARINC_RECV2_CTRL_WREG 0x24
#define ARINC_RECV2_CTRL_RREG 0xB4
#define ARINC_INT_FLAG_WREG   0x34
#define ARINC_INT_FLAG_RREG   0xD0
#define ARINC_ACLK_DIV_WREG   0x38
#define ARINC_ACLK_DIV_RREG   0xD4
#define ARINC_FIFO_SEND_REG   0x40
#define ARINC_RECV1_FIFO_REG  0xA0
#define ARINC_RECV2_FIFO_REG  0xC0#define ARINC_DATA_VALID(ch) (HalGPIOGetLevel(ARINC_R##ch##FLAG_PIN) == 0)/*寄存器结构体*/
#pragma pack(1)
typedef struct
{int RATE  : 1;int PLON  : 1;int LABREC: 1;int PARITY: 1;int SDON  : 1;int SD10  : 1;int SD9   : 1;int RFLIP : 1;
}ARINCRecvCtrlReg_t;typedef struct
{int RATE    : 1;int X       : 1;int TPARITY : 1;int ODDEVEN : 1;int SELFTEST: 1;int TMODE   : 1;int TFLIP   : 1;int HIZ     : 1;
}ARINCSendCtrlReg_t;typedef struct
{int X2   :1;int DIV  :4;int X1   :3;
}ARINCAclkDivReg_t;typedef struct
{int R1FLAG :2;int R1INT  :2;int R2FLAG :2;int R2INT  :2;
}ARINCINTReg_t;typedef struct
{int label : 8;int sdi : 2;int data : 19;int ssm : 2;int parity : 1;
} ARINC429Data_t;
#pragma pack()typedef union
{uint8_t val;ARINCRecvCtrlReg_t recvCtrl;ARINCSendCtrlReg_t sendCtrl;ARINCAclkDivReg_t aclkDiv;ARINCINTReg_t intFlag;
}ARINCReg_t;typedef union
{uint32_t db;ARINC429Data_t ex;
} ARINCdataFlip_t;static ARINC429DataRecv_cb g_recvCallback = NULL;static uint32_t dataFlip(uint32_t data) //翻转高低字节
{uint32_t result = data;
#if 1result = (data >> 24);result |= (data >> 8) & 0xff00;result |= (data << 8) & 0xff0000;result |= (data << 24);
#endif  return result;
}static void chipReset(void) //硬件复位
{HalGPIOSetLevel(ARINC_RESET_PIN, 1);HalWaitMs(1);HalGPIOSetLevel(ARINC_RESET_PIN, 0);  //resetHalWaitMs(1);
}static void regsConfig(void) //寄存器初始化函数
{ARINCReg_t reg;reg.recvCtrl.RFLIP = 1; //是否翻转前八位LABEL数据reg.recvCtrl.SD9   = 0;reg.recvCtrl.SD10  = 0; reg.recvCtrl.SDON  = 0; //是否匹配SD9\10两位,否reg.recvCtrl.PARITY = 1; //接收字的奇偶性检查启用reg.recvCtrl.LABREC = 0; //标签过滤关闭reg.recvCtrl.PLON  = 0; //优先级标签寄存器的不使能reg.recvCtrl.RATE  = 0; //高速数据传输速率HalSPIWriteReg(ARINC_RECV1_CTRL_WREG, reg.val);HalSPIWriteReg(ARINC_RECV2_CTRL_WREG, reg.val);reg.sendCtrl.HIZ = 0; //设置该位使片内线路驱动器输出进入高阻态reg.sendCtrl.TFLIP = 1; //是否翻转前八位LABEL数据reg.sendCtrl.TMODE = 1; //只要数据是有效的就会被立即发送reg.sendCtrl.SELFTEST = ARINC_SELF_TEST; //自测试reg.sendCtrl.ODDEVEN = 0; //偶校验reg.sendCtrl.TPARITY = 1; //使能校验位reg.sendCtrl.X = 0;reg.sendCtrl.RATE = 0; //高速数据传输速率HalSPIWriteReg(ARINC_SEND_CTRL_WREG, reg.val);reg.val = 0;reg.aclkDiv.DIV = 0; //1MHzHalSPIWriteReg(ARINC_ACLK_DIV_WREG, reg.val);reg.intFlag.R1FLAG = 0; //接收器1 FIFO为空时, R1FLAG变高reg.intFlag.R1INT  = 0; //当有效消息被接收,R1INT为高脉冲reg.intFlag.R2FLAG = 0;reg.intFlag.R2INT  = 0;HalSPIWriteReg(ARINC_INT_FLAG_WREG, reg.val);
}static uint32_t readData(uint8_t chnl) //读通道数据
{uint8_t reg;uint32_t data;if(chnl == 1){reg = ARINC_RECV1_FIFO_REG;}else{reg = ARINC_RECV2_FIFO_REG;}HalSPIRead(reg, (uint8_t *)&data, sizeof(uint32_t));return dataFlip(data);
}/*发送数据*/
void ARINC429Send(unsigned char label, unsigned int value, unsigned char ssm)
{ARINCdataFlip_t data;uint32_t num;memset(&data, 0, sizeof(ARINCdataFlip_t));data.ex.label = label;data.ex.data = value;data.ex.ssm = ssm;data.ex.sdi = 0;num = dataFlip(data.db);HalSPIWrite(ARINC_FIFO_DATA_REG, (uint8_t *)&num, sizeof(uint32_t));
}static void dataRecvHandle(void)
{ARINCdataFlip_t data;if(ARINC_DATA_VALID(1)) //通过RxFLAG管脚判断是否接收到有效数据{data.db = readData(1); //读通道1数据if(g_recvCallback != NULL){g_recvCallback(data.ex.label, data.ex.data, data.ex.ssm);}}if(ARINC_DATA_VALID(2)){data.db = readData(2);if(g_recvCallback != NULL){g_recvCallback(data.ex.label, data.ex.data, data.ex.ssm);}}
}/*初始化*/
void ARINC429Init(ARINC429DataRecv_cb recvHandle)
{chipReset();regsConfig();g_recvCallback = recvHandle;
}void ARINC429Poll(void)
{dataRecvHandle(); //轮询接收
}

ARINC429总线收发器 -- HI-3593调试记录相关推荐

  1. AT24C02 IIC总线调试记录

    周末在家调AT24C02,分享一下调试记录,给有需要的人参考一下: 刚开始的时候读出来的数据全部都是0x00:正常新的EEPROM里面的数据没有初始化的都是0xFF: 刚开始怀疑是AT24C02坏了, ...

  2. Nvidia Xavier平台CAN收发控制器调试记录

    1. 前言 由于需要接收车辆的CAN信息,就需要CAN收发功能: 正好xavier平台自带两路CAN控制器: 以下是驱动调试记录 2. 硬件连接 CAN总线获得数据使用OBD2; 连接2个CAN收发器 ...

  3. WK2204 - spi转uart调试记录

    WK2204 - spi转uart调试记录 硬件 芯片简介 电路设计 驱动 添加设备树 添加驱动 调试 查看启动加载 检查串口通信 数据乱码或丢失 RS485只能收不能发 系统中断响应异常 思考 硬件 ...

  4. SN75HVD10 热插拔失败调试记录

    1. 前言 使用的SN5HVD10是一个3.3V RS485收发器, 用于我们的RS485通信. 设计方案非常简单, 就像我在其中一张图片中展示的那样. 在那里是引脚1 (R)上10K上拉. 该设备由 ...

  5. CAN控制器芯片MCP2510调试记录

    CAN控制器芯片MCP2510调试记录 配置CAN内核选项 配置CAN相关的内核选项,将下面几项配置添加到defconfig中: kernel/arch/arm/configs/xxx_defconf ...

  6. XPC调试记录 :TwinCAT生成XML配置文件

    XPC调试记录:生成XML配置文件20210316 1.连接目标控制器 硬件准备:用一根网线将配置有EtherCAT的电脑和EK1100(BECOHOFF总线模块)网线插槽X2(OUT)相连.(正常初 ...

  7. ROS上同时预览depth,IR,RGB 调试记录

    ROS上同时预览depth,IR,RGB 调试记录 用rviz同时显示RGB,IR,DEPTH(验证设备:astraprosm,canglong2,deeyea) 1.编译libuvc库 cd lib ...

  8. ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值——bug调试记录

    ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值--bug调试记录 目录 输出结果 1.增加XGBR算法 ...

  9. [Deepin - Pycharm调试记录] Pyinstaller索引系统库问题

    Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库 现象 在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示 OSError: Py ...

最新文章

  1. 2018/5/1 ----1986年图灵奖PPT
  2. [C#]非阻塞监听键盘输入
  3. shell echo 换行 不换行 打印换行
  4. JavaScript 有多灵活?
  5. 框架:初识Mybatis
  6. MULE ESB中的一些值得关注的地方
  7. 图片服务 - thumbor成像
  8. 秦汉考场科目三路线图_海淀驾校科目三校内考场总结
  9. 设计素材PSD分层模板|美食类海报设计技法
  10. Sqoop增量抽取Oracle数据,最近8个小时的数据未被抽取
  11. linux 输入--输出--重定向 stdin/stdout/stderr
  12. access 跳过一次for循环_Java中的循环结构
  13. NodeMCU(ESP8266) 接入阿里云物联网平台 踩坑之旅
  14. java 16进制_JAVA 十六进制与字符串的转换
  15. 客户贷款逾期预测[2]-svm和决策树模型
  16. 塔夫斯大学计算机教授,塔夫茨大学开发出一系列3D打印半球形超材料 具有独特微波或光学特性...
  17. 鸿蒙思维闪卡训练,提高孩子智力,父母不妨使用思维导图来提升孩子记忆力和创造力...
  18. 易语言GIF屏幕录制
  19. 人体反应测试仪 c语言,人体反应速度测试仪.doc
  20. Python之yaml与excel互相转换

热门文章

  1. ubuntu安装显卡驱动和cuda
  2. Ansys导出刚度矩阵及文件说明
  3. 具有Flash Access保护的HTTP Dynamic Streaming
  4. 解二元一次方程组 含MOD26
  5. AI 硬件加速的重大飞跃!可训练机器学习硬件的光学芯片
  6. Windows下安装zookeeper
  7. Noip2017提高组 退役记
  8. 【C#学习笔记】TextBox使用
  9. coreldraw带圈字符_CorelDRAW如何制作环绕圆形的路径文字
  10. 自行车在线租赁管理系统的设计与实现