关于Si4735的SSB Patch(pu2clr开源项目)

最近在研究基于Arduino + Si4735 + pu2clr/SI4735的数字收音机,FM功能基本已经ok了,感谢pu2clr开源项目作者 Ricardo Lima Caratti 封装了这么好用的库,电路连接正确的情况下,基本可以秒实现功能!

简单试玩了一段时间后准备挑战下传说中的SSB单边带补丁,结果踩到了一个小坑,使用pu2clr库中的代码:https://github.com/pu2clr/SI4735/blob/master/examples/TOOLS/SI47XX_09_SAVE_SSB_PATCH_EEPROM/SI47XX_09_SAVE_SSB_PATCH_EEPROM.ino,准备将SSB补丁写进AT24C256 eeprom中,结果发现执行代码后,数据写入出现了问题,所有验证过程读回的数据全都是0xFF,patch的name什么的在Arduino IDE的Serial Monitor中看到的也都是乱码,size也都是FF对应的错误数据65535这些…

其实之前已经在主程序中实现了eeprom的读写操作,用于保存手收音机的一些状态,如音量、当前频率,频率步进档位等,都是没问题的,所以硬件部分应该是ok的,于是仔细读了写pu2clr的代码,发现原来问题出在这里:

void setup()
{
  Serial.begin(9600);
  while (!Serial)
    ;

  // Storing the patch header information
  strcpy((char *)eep.refined.patch_id, (char *)content_id);
  eep.refined.patch_size = size_content;

  showMsg("Storing the patch file..");

  showMsgText("Patch name.............: %s", eep.refined.patch_id);
  showMsgValue("Size of patch header...: %u bytes.", header_size);
  showMsgValue("Size of patch content: %u bytes.", eep.refined.patch_size);

  // !!!
  Wire.begin();

  uint32_t t1 = millis();
  eepromWritePatch();
  // Comment the line above and uncomment the line below if you want to clean your eeprom.
  // clearEeprom();
  uint32_t t2 = millis();
  showMsgValue("Finish! Elapsed time: %ul milliseconds.", t2 - t1);
  showMsg("Checking the values stored");
  checkPatch();
  showMsg("Finish");
}

如果不预先调用下Wire.begin(),就会导致我遇到的这种问题,当然,也有可能是刚玩Arduino,有什么操作姿势不对的问题,不过加上后,确实patch保存eeprom正常了,再回到主程序调用downloadPatchFromEeprom加载SSB补丁也正常了。

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。