野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12700|回复: 2

【分享】EPSON 爱普生针式打印机 EEPROM BR93L56 丝印 RL56 读写方法

[复制链接]
发表于 2019-12-4 17:38:02 | 显示全部楼层 |阅读模式
本帖最后由 abcrazy 于 2019-12-6 10:05 编辑

由于打印头旁边的传感器没放纸张一直 ON 状态,乱搞一通,把 EEPROM 全部清除,开机全部灯闪。查找资料,发现此 EEPROM 不是用 IIC 时序,网上也没有此款芯片操作说明,自己对着文档自己写时序,类似 SPI 但用 SPI 读不了,只能用 GPIO 操作。幸好是同步时钟读写,对时间方面不严格,比较容易写操作代码。

进入主题:
第一步、确定管脚连接
01.png
芯片拆下来之前,测试了电压,发现跟右边的管脚一致。

第二步、确定 STM32f103 使用的管脚
由于跟 SPI 时序类似,所以,用了 SPI1 的管脚。
PA4 - CS
PA5 - SK
PA7 - DI
PA6 - DO

第三步、CubeMX 配置管脚并生成工程
这里没什么好说的,就 4 个 GPIO 设置,PA6 设置为无上拉输入,其他设置为高速推挽输出。

第四步、测试管脚是否正确
分别将三个输出管脚变换高低电平,万用表测试是否电平正确,免得后面操作步骤正确又找不到问题所在。输入管脚默认是高电平,接地有变化表示正确。

第五步、确定时钟高低电平保持最短时间
02.png
根据手册可知,芯片 VCC 电压 1.8 - 5.5V 都能工作。
我接的是 3.3V 电源,为了不出错,我选择比这两个电源都大的时钟电平保持时间 1微妙。

第六步、分析时序
A.读时序
03.png
需要说明的是,它的数据构成是:
1bit + 2bit + 8bit + 16bit +16bit + 16bit ...
1bit起始位:CS 拉高后,如果 DI 为低电平,则会忽略时钟变换操作,一直到 DI 为高电平时的上升沿时钟,芯片才认为是第一个 bit 开始。
我开始想到用 SPI 操作,因为它从 DI 高电平才算起,那我 SPI 第一字节可以设为 0000 0110 也就是 0x06 ,起始位 + 命令位 组成 1 byte。

2bit命令
04.png

8bit地址
05.png

16bit数据:从时序图可以看出,D15 - D0 也就是每次先读取 uint16_t 类型的高 8 位,再读取低 8 位,MSB 高位先读,需要注意。

要点1:从时序图看,是上升沿采集数据,下降沿变化管脚。
要点2:从时序图看,地址最后1bit也就是 A0 高电平时,需要采集芯片 DO 电平。如果 DI 管脚输出 A0 最后一位地址时 SK 时钟拉高电平期间,DO 电平读取到为低电平,则可以继续操作,如果还是高电平,说明肯定那一步错了。特别需要注意!!!

B.写时序
06.png
需要说明的是,它的数据构成是:
1bit + 2bit + 8bit + 16bit + status

1起始位 + 2命令位 + 8地址位 + 16写入 数据位 + 等待 DO 由低电平变成高电平完成
要点1:两段CS之间时间间隔 1 个电平 SK 时间就可以了。
要点2:第2段 CS 高电平后,延时一个电平 SK 时间读取 DO 电平,如果是低电平 则在写入数据中,如果还是高电平,则肯定出错了。不用担心它会在很短时间写好数据,基本都是3ms后才拉高 DO。

C.写使能
07.png
需要说明的是,它的数据构成是:
1bit + 2bit + 8bit

写使能:1开始位 + 2命令位 + 0xFF
写禁用:1开始位 + 2命令位 + 0x00
芯片每次上电,都会写保护,如果要写入数据,必须写入命令。

D.填充
08.png
需要说明的是,它的数据构成是:
1bit + 2bit + 8bit + 16bit + status

1起始位 + 2命令位 + 0x40 + 16数据位 + 等待 DO 由低电平变成高电平

它与写时序一样,改一下命令和地址就行,写的代码一样。
写入一个 16bit数据,将会把 256 个字节都变成那 16bit 一样。
其实,这个跟擦除一样,都可以把所有位变成 0xFFFF。所以擦除时序就不用分析了。


第七步、写代码
略......都是 GPIO 操作,而且时间控制不严格,按照时序来做肯定能成功操作。


最后:
附上编译 hex 文件,还有 爱普生 LQ-675KT 和 LQ-2680K 的 EEPROM 256 字节原文。
爱普生EEPROM.zip (16.56 KB, 下载次数: 3)
EEPROM_RL56.pdf (1.93 MB, 下载次数: 5)



另外,有空的话,帮我看看:
同一段源码,为什么以下 i++ 代码 KEIL 无法 i++(在 0、1、0xFF徘徊),而 IAR 却能 i++。
代码优化 KEIL 为 0,IAR 为 low

请下载附件对比运行。[mw_shl_code=c,true]uint16_t data_buf;
uint8_t i;
for(i = 0; i < 0x80; i++)
{
if(i % 8 == 0)
{
printf("\r\n------%d--------\r\n", i);
}
data_buf = eeprom_read_once(i);
printf("%02X %02X ", *(uint8_t*)(&data_buf), *((uint8_t*)(&data_buf) + 1));
}[/mw_shl_code]


SPI.zip (5.4 MB, 下载次数: 4)
回复

使用道具 举报

 楼主| 发表于 2019-12-5 19:05:06 | 显示全部楼层
本帖最后由 abcrazy 于 2019-12-5 19:17 编辑

打印头旁边的传感器非常难弄,整个挡板+传感器换全新的上去,都还是开机就叫。
研究了下传感器的电路走向:
05.jpg
这种接法都是 CPU 直接读取传感器的电压值,达到一定阀值,就认为有纸张进入,奈何百度搜不到怎么设置阀值。有知道的告诉下。

内部修改不了,打算外接串联 1 个 100kΩ 电阻降低开机电压,虽然成功开机不报错,可是放纸没识别到有纸张进来
01.jpg
02.jpg

最后,没有办法,破罐子破摔,干脆把塑胶挡板传感器底下打个大洞,开机不报错了,电压下降了,有 0.09V,高于 0.13V 开机都会报错。
03.jpg

纸张位于传感器下面时的电压有 1V
04.jpg


破坏法不提倡,有知道怎么修的告诉下。

另外,建议大家不要买打印头底下有传感器的打印机,换零件都修不好。
还有就是,如果打印的纸张有深色不反光的,也不建议买前进纸传感器是光电开关的打印机,反射弱光打印机不会吸纸。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 19:06:57 | 显示全部楼层
唉........
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-4 18:46 , Processed in 0.028656 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表