这是谁的地盘?

文章由:Aaron Lager

一位刚从学校毕业的工程师在设计一个角色显示器时,学会了不要相信别人告诉他的一切。

这是我在北湾地区的大学小型合同制造公司的第一份工作 - 他们有一个小工程部门。我喜欢小小的,因为它意味着我必须在项目设计的前线剪切牙齿,都是硬件和软件。

经过几个月的小项目,他们在看似简单的一个上将我降落。该任务是设计一个2×20个字符显示,与标准Hitachi LCD接口(HD44780)兼容。这也必须是一种改装产品,可以与我们的控制器以及竞争控制器产品合作。我负责界面,角色生成和显示绘画/扫描。其中一个主要目标是采取耗费设计,所以我决定使用当时的新赛普拉斯PSoC。该芯片允许我们拉动高压电源,显示输出接口,并将数据输入全部输入微控制器。这是一个单一的芯片设计。以前的设计,占据相同的物理尺寸,完全覆盖在表面贴装部件中。

在获得要显示的数据后,下一个任务就是将用户数据输入芯片进行显示和控制。第一代显示器使用一个简单的移位寄存器以串行形式接受数据输入,并以并行输出它。正因为如此,之前的设计师掩盖了一个很大的缺陷,当然在我被雇佣之前,他们早就不在了。数据应该是简单的SPI模式0。但是,有人告诉我,当串行接口多路复用时,时钟就会变快。作为一个幼稚的新手,刚从学校毕业,我只是把它当作事实,根据时间,创造特殊的案例来处理时钟线上升。

这是我第一次挑战开始的地方,显示器上的数据乱成一团。这应该没有那么困难,我有可以很好地显示数据数组的例程,现在我只需要从SPI寄存器中获取数据并填充数组。即使我弄错了顺序,它们至少是ASCII字符,但这是胡言乱语。

经过仔细检查,时钟和数据的上升时间在100µs的范围内。在我看来,这似乎很快,但一个电话给赛普拉斯的现场应用工程师(FAE),让这个年轻的学生直了起来——这是可怕的缓慢上升时间。当时钟线经过过渡区域时,它上的噪声导致多个时钟过渡被断言。我把这个带回给我的主管,他告诉我这可能是来自RC滤波器,被放在时钟和数据线上。他告诉我,如果没有它们,SPI就无法在原来的显示器上工作。“嗯,真奇怪,”我想。我们绕过了RC,并确认了快速时钟转换,设计工作。但这是作为翻新出售的,我们不能要求客户从他们的控制器上移除表面安装部件。

这就是PSoC开始奏效的地方。在FAE的帮助下,我们将时钟输入路由到芯片内部的一个慢速模拟比较器中,以消除多重转换。然后我们使用更多的内部路由将信号传回SPI模块。所有这些信号处理,没有CPU资源被使用-它工作得很好。

我们自由自在,直到我将杰作插入我们的竞争对手的董事会,它不起作用。怎么可能是怎样的?我看了输入信号,它们是SPI模式0符合。我们的控制器不是!

对SPI进行了更多的挖掘和阅读,让我们意识到,离去已久的工程师已经将我们的主控板放入了SPI模式2。这将数据采样放在下降边缘,但随后他用RC延迟偏移时钟相位,使数据刚好进入时钟信号正过渡的正确位置。这本质上使我们的控制器输出模式3 SPI数据。他还用一个事实掩盖了这一点:8位的零被放在实际数据字节的前面和后面。管理人员坚持认为显示器必须双向自动工作,因为旧的显示器可以做到。

我需要一种方法来制作模式0和几乎兼容的模式3中的串行接口工作。我们获得了所有竞争对手的控制器板的样本,我开始查看启动序列和SPI模式。我们的板是唯一一个有错误的SPI模式的模式,所有其他人都是完全模式0符合要求。我们的董事会在启动时也是最保守的。在将数据发送到显示之前,它在上电后有一个长的500ms延迟。另一个电路板全部将数据发送到100ms以下的显示器。这是我拯救的恩典。我可以在检测到第一时钟边缘时启动一个计时器并停止计时器,如果它超过300ms,它是我们的电路板,所以设置模式3,否则做正常模式0.再一次,它像冠军一样工作。他们说,他们说:“它需要热插拔。当你热插拔时会发生什么?”它对我们的竞争对手的控制委员会工作良好,但不是我们的竞争对手。argh!

最后一个障碍以一种相当优雅的方式克服了。我称之为自动位对齐。在日立协议中,发送的每个数据字节中都有一个E位。对于任何有效数据,这个位都是1。之前,我忽略了这个位,因为它总是1。我修改了这个,这样当接收一个字节时,如果'E'不是1,这个字节就会被丢弃。在SPI接口被停用的一小段时间后,我重新打开它,等待寄存器填满。这个过程会一直重复,直到“E”是1。

这种方法如此简单且坚固,说明是使用电线并使时钟线路高或低,或高或低的数据线,并观察恢复过程。它通常在一个字符之后恢复,但有时它在显示器对齐之前在显示屏上花了三个损坏的字符。电线被使用,因为在热插拔时,恢复几乎总是难以察觉的。我再次检测到显示器已插入哪种类型的控制器,但是比较所有控制器允许我再次使用时序模式来区分和工作。最后,该项目完成了!展示取得了成功,我们每年销售约10K单位。

第一年我学到了很多。主要是不要总是相信别人告诉我的,在调查的时候要尽职尽责。

Aaron Lager.在高级编程中工作,涵盖软件社区现在称之为完整的堆栈开发。

留下你的评论