作者zzss2003 (brotherD)
看板Electronics
标题[问题] 求救!!写不出I2C我就要走路了
时间Sun May 28 22:14:54 2017
小弟是社会新鲜人,刚到公司自学不到一个月就被任命要在一个礼拜内写出I2C通讯的程式
是的,您没看错,没有前辈带。
小弟现在要用PIC16F1824与OZ8920(battery protection IC)通讯,我已经把I2C的spec看
完一遍了,也把PIC16F1824的MSSP module稍微看过一轮,但还是不知道怎麽起头。
我知道所有I2C的流程,Start, slave address, R/W, ACK, Stop,但是要如何变成程式码
就是有困难。
我有上网抓I2C的范例,但是看了之後觉得跟SPEC上写的流程完全不一样,我还上国外论坛
请教,但没有人能帮助到我的情况。我发文的网址:
http://www.microchip.com/forums/m994750.aspx?tree=true
接着我又找了这个视频
https://www.youtube.com/watch?v=yM9OpRPMEAE,然後发现明明都
是I2C的通讯规格,为什麽这个视频有分address high跟address low,我才怀疑会不会是
跟不同IC通讯时,都要配合各个IC相对应的Timing diagram,我不确定,所以想上来请教
前辈们。
我现在要做的事情只有从OZ8920的register中抓取想要的资料,OZ8920其他的动作皆由硬
体完成,想请前辈们给小弟一点方向,让我知道能从哪里下手,拜托了!不然我就要GG了!
这里是OZ8920的datasheet:
https://www.dropbox.com/sh/apiqddpjlv26ceq/AAA_HjaRwg8dPN0fSVTg2ddTa?dl=0
6/1补充:下载过datasheet的大大,请帮小弟一个忙,看完之後删掉此档案,因为主管说此
文件不能外流QQ
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.215.197.69
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1495980900.A.E29.html
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:16:10
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:16:54
1F:推 TWkobe: 有先确定接线都符合spec规范? 05/28 22:23
有,我们公司全部都是硬体工程师,版子已经做好了,只有我一个韧体工程师
现在的情况是deadline已经要到了,版子已经全部弄好了,就差在韧体写进去就完了
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:28:47
2F:推 TWkobe: mcu有先量过gpio产生的方波符合spec的要求? 05/28 22:29
这个......我完全不知道也没这个观念,但我想前辈们应该都知道这个要求,因为他们使
用这颗ic很久了
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:33:36
3F:推 TWkobe: 看spec这i2c是write/read的basic function看page 34 05/28 22:33
4F:→ TWkobe: slave addr就是你这个外部设备的地址 05/28 22:33
5F:→ TWkobe: 你看p16有写要符合方波的要求 05/28 22:35
我看了page34,他要先给slave address(这颗IC是60H),但我有个疑问,60H不是1个byte
的表示法吗?可是它只能给7个bits,意思是我60H要用7个bits表示吗?(变成C0H)
给slave address後,接着给reg_index,这跟PIC上的spec写的方式不同,PIC上面是给
slave後就直接给data了。这样是不是代表是说,不同IC虽然都是用I2C规格通讯,但传送
讯息的方式却是要依照IC的spec下去指定?
我有看Page16了,但我没有看到方波的需求,都是跟时间有关系的参数
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:45:55
6F:推 TWkobe: address high/low 应该只是一次接收量不够分high low 05/28 22:39
7F:→ TWkobe: 实际上还是当作address而已 05/28 22:39
9F:→ hsucheng: ti的文件,只有7页希望对你有帮助 05/28 22:41
另外,在page34,在Write_data的後面有一个叫CRC,想请问前辈那是什麽?
谢谢hsucheng大大
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:48:28
10F:推 TWkobe: CRC是校验码, 偶尔会因为有杂讯造成data错误 利用这个可以 05/28 22:51
11F:→ TWkobe: 简单还原正确的data 05/28 22:51
那我猜我应该不用理它,因为我现在只是要抓电流跟电压的register判断是否在充电放电
跟充饱了没,就算有误差也不影响。
我想请教一下,我上面假设的60H→C0H是对的吗?我应该只要照着page34的方式下去写就行
了吧?
※ 编辑: zzss2003 (49.215.197.69), 05/28/2017 22:54:39
12F:推 TWkobe: 地址是0x60, 但实际上只要喂7bit address, 有些可以直接给 05/28 22:55
13F:→ TWkobe: 0x60, 有些要手动shit 1bit 05/28 22:55
14F:→ TWkobe: 我是有遇过要手动shift的 05/28 22:55
15F:推 tommycc: PIC 8bit系列应该可以用plib降低开发难度 05/28 22:55
16F:→ TWkobe: 你就弄一个#define addr 0x60 05/28 22:56
17F:→ TWkobe: #define addr_msg addr>>1 05/28 22:56
18F:→ TWkobe: 实验看看需不需要手动移, 正确的话,slave端会回传一个ack 05/28 22:57
19F:→ TWkobe: 至於pic的讲的应该是他的libs作法, 我习惯先自己写一个 05/28 22:58
20F:→ TWkobe: software i2c function先验证是否正确 05/28 22:58
21F:→ tommycc: 喔不,不支援pic16f 05/28 23:00
22F:→ TWkobe: 还有p16重点是看此装置的i2c是active high or low 05/28 23:00
23F:→ TWkobe: 通常是看start signal, 这spec看起来是active low 05/28 23:01
24F:→ TWkobe: 意思是说sda先low一段时间後, 接着scl开始low 05/28 23:04
25F:→ TWkobe: 弄个虚拟码你大概就知道怎麽做 05/28 23:05
26F:→ TWkobe: void swi2c_START (int delyTime) { 05/28 23:05
27F:→ TWkobe: sda_set(); delay_us(delayTime); 05/28 23:07
28F:→ TWkobe: scl_set(); delay_us(delayTime); 05/28 23:08
29F:→ TWkobe: sda_clear(); delay_us(delayTime); 05/28 23:08
30F:→ TWkobe: scl_clear(); delay_us(delayTime); } 05/28 23:09
31F:推 TWkobe: 然後再弄一个swi2c_WRITE(int msg) { 05/28 23:12
32F:→ TWkobe: int data=msg; for(int i=0; i<8; i++) { 05/28 23:13
33F:→ TWkobe: if(data & 0x01) sda_set(); else sda_clear(); delay; 05/28 23:16
34F:→ TWkobe: data >= 1; } 05/28 23:16
35F:→ TWkobe: 这个function 可以用来解析要写入的data来控制sda 05/28 23:17
36F:→ TWkobe: 例如要写入的slav_addr / reg_index / write_data都可用到 05/28 23:19
37F:→ TWkobe: 最後再凑一个swi2c_writeMSG function来组合完整的write 05/28 23:21
38F:→ TWkobe: sequence 05/28 23:21
39F:→ TWkobe: 写好後拿示波器量测scl/sda是否有符合完整个write signal 05/28 23:22
40F:→ TWkobe: 当你完成写入上述三者都应该会在sda看到正确的ack signal 05/28 23:23
41F:推 TWkobe: 还有pic说给完address就给data的说法为何跟你spec不同的 05/28 23:26
42F:→ TWkobe: 原因是你装置spec的reg_index/write_data也是data呀 05/28 23:27
43F:→ TWkobe: 不是因此i2c有何不同, i2c是标准大家都差不多, 只差在喂的 05/28 23:28
44F:→ TWkobe: data会不同 所以pic官方才说直接後面给data 05/28 23:28
45F:→ TWkobe: 剩下的就可以依据我说的弄出read的完整function了 05/28 23:30
46F:推 TWkobe: 我忘了说msg之间的w/r bit是干嘛 05/28 23:34
47F:→ TWkobe: 这个是说接下来要对slave装置是要进行read或write动作 05/28 23:35
48F:推 TWkobe: 然後在说一下read sequence, 比较复杂一点 05/28 23:37
49F:→ TWkobe: 他等於要先对slave写入address/reg_index後 05/28 23:38
50F:→ TWkobe: 结束一次i2c再重新restart写入地址, 接着就重slave端读取 05/28 23:39
51F:→ TWkobe: sda signal 05/28 23:39
52F:推 amistad: 推好人 TWkobe。补充一下,虽然都是 I2C 但各家实作的 05/29 00:06
53F:推 amistad: 略有不同,但基本原理类似。需要跟预slave 端IC 来加以确 05/29 00:09
54F:→ amistad: 认。 05/29 00:09
55F:→ amistad: 另外,之前经验因为sda是三态连线,驱动方向跟驱动能力都 05/29 00:10
56F:→ amistad: 小心调整。 05/29 00:11
57F:推 bxc: 其实你这问题分成几个1.你要发出正确I2C 2.OZ8920 3.硬体问题 05/29 09:02
58F:推 Williamette: TWkobe真是佛心来的 05/29 14:37
59F:推 teddy98: 看似TWkobe是你的贵人了 05/29 15:20
60F:推 katzlee: 佛心推文 05/29 15:31
61F:→ katzlee: 先用示波器看是不是有ACK吧 05/29 15:33
62F:→ katzlee: 另外你不用去国外论坛,microchip的台湾论坛就有小编和其 05/29 15:34
63F:→ katzlee: 他高手会帮忙你了 05/29 15:34
64F:推 NCTUbigGG: 推TWkobe! 05/29 17:22
65F:推 jeffic0730: 推kobe~ 05/29 19:13
66F:推 ping870224: 推 05/29 20:26
67F:推 furio: 推TWkobe好人 05/29 21:46
68F:推 doubletime: 推twkibe 05/29 21:57
69F:推 Biglottery: 推Kobe 真的是活菩萨 05/29 22:54
70F:推 porpoisewise: 用GPIO 兜,把时序一个一个输出再换成输入... 确认 05/30 01:40
71F:推 fxp87117: 佛心推 会有好报 05/30 19:29
72F:→ yugi2567: 推好人一生平安 05/30 23:59
※ 编辑: zzss2003 (60.248.26.157), 06/01/2017 10:59:44
73F:推 kobe8112: 帮你推TWkobe好人一生平安,真的是大贵人 06/01 12:56
74F:推 yugi2567: 原来道歉露出咪咪不犯法 因为咪咪只要被人知道 就不算是 06/04 21:43
75F:→ yugi2567: 咪咪啊!!!! 还主管说不能外流 06/04 21:43
76F:嘘 k012727: 连I2C都没办法自学…我是觉得你不要去雷人家硬体了…後 06/04 23:33
77F:→ k012727: 续bug会解不完 06/04 23:33
78F:→ dysyase: 蜜月期都没过完就要包生(还指定性别)!2号才刚找书耶 06/16 11:02