
第四期:上一辑那条 F28335 批次 ADC 问题补齐数据后由 TI 判定增益超规,另有量产写 JTAGLOCK 锁死一颗芯片、双核分工下 CPU2 读不到 HRPWM 校准寄存器、C2000Ware 的 Debug 库把配 flash 的代码放进 flash,以及 MotorControl SDK 的 BiSS-C 库又查出四处缺陷。
| 层级 | 含义 |
|---|---|
| A | 用户一手实测,型号、板卡、条件与复现过程至少写到能被人照着查 |
| B | 用户一手陈述,型号或测试条件有明显缺口 |
| C | 二手转述、市场观察或行业媒体报道,只作背景 |
| V | 厂商材料,用于核验规格与设计 |
Vref = 2.048 V,器件 REF5020IDR,环境温度约 +25 °C。所有通道都偏大,采样保持电路 A 与 B 没有差别。1| 输入电压(V) | 正常批次码值 | 异常批次码值 | 差值 |
|---|---|---|---|
| 0.6683 | 906 | 940 | 34 |
| 1.2725 | 1743 | 1798 | 55 |
| 1.8107 | 2470 | 2561 | 91 |
| 2.4136 | 3294 | 3412 | 118 |
| 2.8592 | 3899 | 4047 | 148 |
| 2.8984 | 3955 | 4095 | 140 |
| 2.9864 | 4077 | 4095 | 18 |
G4A-49APDYW、正常片 G4A-3AAC9IW。改内置参考重测这件事,他说测试流程与软件都没动过,打算往后放。12340-G4A-3AAC9IW-NA,异常批次 2437-G4A-49APDYW-4478989PHI;采样率与参考源之后的滤波未披露0x9FFFFFFF 改成 0x9FFFFFF0,打开 F280049 的 JTAGLOCK。测试环境是 C2000Ware_1_00_05_00、CCS 12.7、一颗全新芯片。2InvalidAddress,写不进去。第二条是让程序自己去写:先用 UniFlash 把程序 A 烧到 0x100000–0x108000,烧完运行正常;然后在程序 B 里改那片区域,HEX 8 位模式,地址 0x108000–0x110000 加上 0xF0030。2STATCMD 读到 3(CMDDONE|CMDPASS)表示命令成功,把任何非零当错误是流程图的写法有问题;F2800157 上 STATCMD 在 CCS 寄存器视图里看不到,要用 Fapi_getFsmStatus() 读。20x9FFFFFFF 改为 0x9FFFFFF0;擦除范围为整片 flashCPUSEL0),EPWM12 留给 CPU1。普通 PWM、ADC 触发与中断在两颗核上都正常。3HRCNFG 设成两边沿、CTLMODE = CMP、HRLOAD = CTR_ZERO_PRD、AUTOCONV = 1;HRPCTL 的 HRPE 与 TBPHSHRLOADE 都置 1。3SFO_ERROR;换成 C2000Ware 里 libraries/calibration/hrpwm/f2837xd 的 SFOv8fpulibbuildc28coff.lib(他说这份二进制在 5.01、6.00.01 与 26.01 里完全一样),6 次之后返回 SFO_COMPLETE,但并没有真的完成校准。3MEP_ScaleFactor = 59,约合每个 MEP 步 170 ps;再把这三路交回 CPU2。交回之后,CPU2 侧仍然读 0,而 CPU1 侧(此时已不是所有者)调试器里 HRMSTEP 在 0 与 59 之间跳,HRCNFG 在 0 与 0x53 之间跳。3HRCNFG、CMPAHR、HRPCTL)是否同样受限、以及如果 SFO 只能跑在 CPU1,那 CPU1 定期校准与 EPWM 归 CPU2 能不能共存。3libraries/calibration/hrpwm/f2837xd 的 SFOv8fpulibbuildc28coff.libCPUSEL0 归 CPU2;HRCNFG 两边沿、CTLMODE = CMP、HRLOAD = CTR_ZERO_PRD、AUTOCONV = 1;HRPCTL HRPE = 1、TBPHSHRLOADE = 1;CMPA 在 0 与周期处装载;母线电压与功率级未披露Flash_initModule() 本身放在 .TI.ramfunc,但 Flash_writeTrims() 是 static inline,没有 CODE_SECTION 指示;Debug 库用 --opt_level=off 编译,内联不展开,于是这个函数连同两个校验函数落进了 .text 段。4RAMM1 留了余量,RAMLS9 没留;TRM 把 MCUCNF1 的 D2–D5 字段标成只读,而 driverlib 从 CPU1 写它;TRM 说所有专用 RAM 都有 ECC,数据手册的内存表把 D0–D5、LS0–LS9、GS0–GS4 标成 Parity。4main() 开头读 D2–D5 的分配寄存器,全部读到 0,即这几块 RAM 上电后归 CPU1。TRM 给这几位的复位值写的是「X」,作者想请 TI 确认这是不是定义好的复位状态。4driverlib/ccs/Debug/driverlib.lib(--opt_level=off);FLASH 构建;上电复位、开机时不接调试器Flash_writeTrims() 是否安全;prefetch 那条到底按 8 字还是 16 字留余量;RAMLS9 要不要同样缩短;D2–D5 上电归属是否就是 CPU1libraries/position_sensing/bissc,例程是 solutions/absolute_encoder_boostxl_posmgr。上一轮他们报了 5 个问题,TI 的 Peter 确认并立了 bug;这一轮补的是第 6 到第 9 处。5pm_bissc_source.c 第 617 行是 returnBits |= data[element] << tempIndex;,returnBits 是 uint64_t,data[element] 是 32 位,移位在 32 位里算完再或进去,越过第 31 位的部分就丢了。默认 42 位帧下不会碰到,但位置字段更长时(例如 MT 24 + ST 19)会拼出错的位置。5PM_BISSC_CD_RDATA_DATA_BITS = 12 − 1 − 1 = 10,于是 PM_BISSC_CD_RDATA_START_S 得 9,而 12 位字里的 Start 位实际是第 11 位,CDS_S = 10 才对得上。库自己没用这个宏,所以现在不报错;用它的应用代码会读错位。5PM_BISSC_ENCODER_HAS_CD_INTERFACE 在头文件里按「值」用,#if 判断;在 pm_bissc_source.c 与例程里又按「是否定义」用,#if defined() 判断。用户照文档把它设成 0,按定义判断的那几块仍然编译进去,还会引用被 #if 去掉声明的表,构建看起来会断。5bissc_getCRC() 在内部头文件里声明带了 ramfunc 属性,但定义所在的 pm_bissc_crc.c 只包含了公开头文件,属性在定义点不可见,函数就落进了 .text。5PM_bissc_receivePosition()(本身是 ramfunc)第 293 行调用它。所以在 FLASH 配置下,CRC 每帧从 flash 里算,作者判断这不是本意。他们给定义加上属性后,map 文件里这个函数确实进了 .TI.ramfunc。5BISSC_MA_CLOCK 8.0 MHz,因整数分频变成 8.33 MHz,在 SPI 从机模式(时钟由 CLB 供给)下到底受哪条限制——TRM 的「不大于 LSPCLK / 4」(LSPCLK = 25 MHz 时是 6.25 MHz),还是数据手册的 4 tc(SYSCLK)(200 MHz 时是 50 MHz)。他们自己按 2 MHz 跑,所以这一条不卡进度,但仍想知道正确上限。5#if defined 写法是否在后续版本统一;修复会落在哪个 SDK 版本.TI.ramfunc 的帖子与这一维度最近,现状列在文末。.TI.ramfunc,PI_Run() 解析到 RAM 地址,但启动 memcpy() 之后 RAM 里反汇编出来仍是 0000 ITRAP0。作者关心的是延迟,TI 的 Ira 说会看工程文件后再答,暂无结论。10github.com
github.com
kb.hpmicro.com
e2e.ti.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.