MB2 开发笔记
# 座子错位
调试USB的时候发现通讯不上, 测量的时候发现引脚不对, 经检查发现是主板对sensor板3.3V没有加上, 导致所有引脚偏移了一位
# 16V电源异常
有个比较严重的问题, 机器带着墨盒上电, 会出现电流异常增大, 表现为2个16V的4504芯片和16Vdcdc发热, 电源电压从 4V 降到 3.3V 以下关机了, 经历了以下排查步骤:
1. 16V_EN 和 16V_CUR 标号弄反, 飞线之后好了, 后来又不行了, 本质只是概率降低, 并不是完全好了
2. 后来定位到电池升压到16V, 9V的地方, 没有用mos管拦住, 导致4V直接通到16V的地方, 上电之后会让4504芯片通电, fpga上电之后状态不确定, 导致墨盒一直通着电, 通电就会掉电, 导致机器无法越过bl这个坎, 无法初始化fpga, 上电时拆下墨盒是临时解决方案
3. 打印时总是有一定几率电流变得很大, 导致关机, 原因未知
4. 把dcdc芯片和4504芯片换了, 打印不出来了, 怀疑是板子问题
5. 上电时fpga总是有类似喷墨信号输出, 经查是fpga初始化代码有操作eeprom的操作, 是不用的, 我拷贝错了
# 鼠标传感器
## 事务流程
1. 创建一个sen_buf[2]的数组, 把要读写的内容放到这个数组里, 再把这个数组地址配置到相应的DMA参数里, 通知DMA启动
2. 通过上述的流程, 可以把数据发给传感器, 做初始化, 例如设置开启, dpi等
3. 当通过配置后, 传感器检测到移动, 就会有中断, 此时在中断函数里发出一个读取0x02的指令, 并启动DMA
4. DMA成功读取到数据之后也会来一个中断, 此时我们在DMA中断里处理刚刚获得的数据, 这个数据就在sen_buf[2]里, 因为我们指定了获得的数据会填在这里
5. 因为我们需要3个数据, 这时我们在DMA中断里处理数据之后再次发起读取0x03, 0x13的指令, 并且处理相关计算, 例如获取的数据怎么转换成我们需要的形式, 滤波等...
6. 因为3个数据需要连续读, 如果此时又来一个普通中断, 会大乱顺序, 所以我们要通过一个flag来控制, 如果正在处理3个数据的过程中, 又来了中断, 则不处理, 直到处理完毕之后, 再读取一下中断脚, 如果有中断就处理, 如果不这样的话, 这个中断一直被拉低没人处理
7. 处理完之后我们就得到了一个时间值x, 该值代表了墨盒应该在x微秒喷一次竖列, 我们只需要把这个值实时更新给fpga就好了
## 中断不来
鼠标传感器的中断脚刚好和CDCTL的中断脚是同个标号, 飞线了一下
## 读取数据有问题
鼠标传感器的SPI套路和CDCTL一样, 全部复制过来
来中断时, 我发查询指令的时候, 读取02寄存器, 读取03寄存器, SPI理论上应该是这样的:
| 寄存器地址 | 读时的废值 | | 数据返回的寄存器 | 读回来的数据 |
| --- | --- | --- | --- | --- |
| 0x02(reg) | 0x?? | (返回数值) | 0x02(reg) | 0x?? |
| 0x03(reg) | 0x?? | (返回数值) | 0x03(reg) | 0x?? |
结果却是:
| 寄存器地址 | 读时的废值 | | 数据返回的寄存器 | 读回来的数据 |
| --- | --- | --- | --- | --- |
| 0x00(reg) | 0x?? | (返回数值) | 0x00(reg) | 0x30 |
| 0x30(reg) | 0x?? | (返回数值) | 0x30(reg) | 0x?? |
其中, 00寄存器读回来的值确实是0x30没错, 但是他把这个值当作了下一个要读的寄存器
经过分析, 这是典型的队列错乱导致的, 原因是我没有严格按照CDCTL的SPI模板去套用, 我初始化的步骤用了普通的SPI发送, 导致DMA队列错乱, 最后严格按照模板套用就解决了
评论
发表评论