已经搞定,是我傻乎乎的把寄存器地址弄错了,手册读和写的时序图完全正确,等把led灯位完全测清楚之后发帖留念 从机械键盘上得到几个led矩阵控制芯片,查不到资料,猜测是IS31FL3731,根据3731的手册写了I2C的测试程序,写硬件地址后芯片应答正常,改成错误地址后应答异常,应该能确定硬件确实是IS31FL3731,但是接下来的写入数据控制led都应答正常,但是控制无效,尝试了读取功能寄存器数据,发现逻辑有点不清楚,几种可能都测试了读取结果都有问题。
下面是寄存器读取逻辑,软件翻译了一下贴上来看吧,翻译不准确。
读取得时序图
根据时序图写的测试代码(为了少占空间每个write后的应答检测去掉了),流程是
启动-硬件地址(写)-命令寄存器地址-
应答寄存器地址-停止-启动-硬件地址(写)-
命令寄存器地址-停止-启动-硬件地址(读)-读取-停止
这里我没搞清楚上面标红的应该是命令寄存器地址还是应答寄存器地址,都试过,正确结果应该是0x00,但实际写命令寄存器地址读取到的是上面写入的绿色字体的应答寄存器地址,就是说我写0x01就读到0x01,写02就读到02,如果写应答寄存器地址结果会读出来0xff。结果肯定都是不对的。
现在我没法确定到底是硬件挂了(键盘主控挂了,微热,已断开)还是代码有问题,又想不出来该怎么确认了,大家帮我看一下,下面贴上原文手册和我的测试代码,如果有需要哪部分翻译的我截图,网络翻译的能看不能下载- //功能寄存器读取
- Start();
- Write(0xe8);//硬件地址
- Write(0x0b);//发送功能寄存器地址
- Write(0x01); //读取地址01
- Stop();//重启
- Start();
- Write(0xe8);
- Write(0x0b);//发送功能寄存器地址
- Stop();
- Start();
- Write(0xe9);//硬件地址(读)
- i=Read();
- Stop();
手册下载链接:
https://pan.baidu.com/s/1o-YZHZykJCVRe7Cek9UkyQ [ 此帖被飞向狙沙在2018-03-27 13:36重新编辑 ]