You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决函数声明冲突:EVAL-CN0391-ARDZ适配Arduino Due编译报错

解决Arduino DUE上CN0391 Shield的SPI函数冲突问题

错误原因

你遇到的编译错误是因为Arduino DUE的底层SAM3X8E库(libsam)已经内置了SPI_Read和SPI_Write函数,而CN0391的驱动代码里又定义了同名函数。C语言不支持函数重载(即同名但参数不同的函数无法共存),因此编译器抛出"冲突声明"的错误。

DUE内置的函数签名:

uint32_t SPI_Read(Spi* spi);

CN0391代码里的函数签名:

void SPI_Read(unsigned char slaveDeviceId, unsigned char* data, unsigned char bytesNumber);

两者名字完全一致,但参数、返回值均不同,直接导致编译冲突。

解决方案(新手友好版)

最直接有效的方法是给CN0391代码里的SPI函数重命名,步骤如下:

  1. 修改头文件中的函数声明
    打开CN0391代码的include/Communication.h文件,找到以下两行:

    void SPI_Read(unsigned char slaveDeviceId, unsigned char* data, unsigned char bytesNumber);
    void SPI_Write(unsigned char slaveDeviceId, unsigned char* data, unsigned char bytesNumber);
    

    将函数名改为自定义名称,比如CN0391_SPI_Read和CN0391_SPI_Write,修改后如下:

    void CN0391_SPI_Read(unsigned char slaveDeviceId, unsigned char* data, unsigned char bytesNumber);
    void CN0391_SPI_Write(unsigned char slaveDeviceId, unsigned char* data, unsigned char bytesNumber);
    
  2. 修改源文件中的函数定义
    打开src/All CPP Files/Communication.cpp文件,找到这两个函数的定义部分:

    void SPI_Read(...) {
        // 原函数内容
    }
    
    void SPI_Write(...) {
        // 原函数内容
    }
    

    同样将函数名改为CN0391_SPI_Read和CN0391_SPI_Write,函数内部代码保持不变。

  3. 全局替换所有函数调用
    在所有调用这两个函数的文件中(比如AD7124.cpp、CN0391.cpp、main.cpp),把所有SPI_Read(...)替换为CN0391_SPI_Read(...),SPI_Write(...)替换为CN0391_SPI_Write(...)。可以用编辑器的全局替换功能(如VSCode按Ctrl+Shift+H)快速完成,避免漏改。

  4. 清理缓存重新编译
    如果使用PlatformIO开发,先点击工具栏的Clean按钮清理旧编译缓存,再点击Build重新编译。

额外提示

如果后续仍有编译错误,大概率是CN0391代码针对UNO的引脚定义与DUE不兼容,需要检查并调整引脚映射(比如CS引脚、SPI引脚的对应关系)。

内容的提问来源于stack exchange,提问作者Anthony Limon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:20:41