IR35207/IR35209/IR35210/IR35212/IR35215

一丶通信协议:

  R35215及其同系列的都是使用的I2C通信协议,以下是关于该协议使用方式,个人理解,供参考

  I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。

  开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

  结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 

  应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接                          收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障 

 

 

  数据传输一般由主机产生的停止位P终止,但是如果主机仍希望在总线上通讯它可以产生重复起始条件Sr和寻址另一个从机,而不是首先产生一个停止条件。以下是完整的数据传输信号图:

 

  协议是很简单的,就是约定的一种规则,按照它的格式来就行了。

二丶烧录

  notes:Read 跟其它的操作不一样,标志Sr表示的是重新给一个 Start 信号,直接给 Start 就行,不用在它之前加 Stop 。

  通信协议确定了也就知道了它数据传输的方式,这也就确定了该用到哪些管脚进行烧录,

  以IR35215为例....

    

  SM_DAT(9):数据pin;     SM_CLK(10):时钟pin;

  VCC(39):电源;          GND(41):接地。  

  PROG(34):I2C/PMBus address

  

  这里要注意一下,开漏输出 : 输出端相当于三极管的集电极未接任何电平, 要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。一般的用法是会在漏极外部的电路添加上拉电阻。I2C主线上的电阻是上拉电阻,是为了保证电平状态,不是供电的;比如控制器无输出信号的时候,主线上确定为高电平,有低电平信号时,则主线上信号被拉低,为确定的低电平。

 

  这类芯片属于onetime programmable (OTP) memory  device ,每个 store 只能写一次数据,扩展一下,我这里介绍的是按块写的,每个块只能写一次。还有按地址、bit的,按bit的IC每个bit只能从“0”变成“1”,或者从“1”变成“0”(bit只能被写一次);


进入正题….

这里的芯片支持的操作有 read,write。

在执行每个操作前需进行如下操作:

Base function:

  1. 供电接地,另外还需给prog pin 供3.3V的电压,让它进入test mode,so it’s i2c address is fixed at 0Ah。知道了I2C的地址,现在就可以跟芯片进行通信了。

 

  1. 芯片的是否被写过,本文中的芯片有两个区间CNFG和User支持烧写,它们的烧写次数有限,The configuration section (CNFG) stores device specific information and allows 5 writes. The user section (USER) consumes most of the OTP memory and can have up to 27 writes.所以CNFG有5个image,USER 有27个image。

     For CNFG,读0x62的数据,有效数据为[4:0]这5个bit 的状态表示芯片被写的次数及被写的是哪个image,只有知到了这个才能对CNFG进行后续的操作。

          For User,读0x64,0x65,0x66,0x67的数据,把它们拼接成0x65[31:24]+0x64[23:16]+0x67[15:8]+0x66[7:0]这种形式,这里的“+”是拼接的意思,不是数学里面的相加。

       Examples:
            1. If 0x62[4:0] = 00111, the first three images (0, 1, 2) of the CNFG section have been programmed. The nextprogramming pointer should be set to 3;
    2. If 0x64[15:0] + 0x66[15:0] = 00000000 00000000 00000000 00011111, the first 5 images (0, 1, 2, 3, 4) of the USERsection have been programmed. The next                          programming pointer should be set to 5。

   上面的0x64[15:0] + 0x66[15:0] ==0x65[31:24]+0x64[23:16]+0x67[15:8]+0x66[7:0]

      Examples:
   1. If 0x62[4:0] = 00111, the next CNFG programming command to register 96h should be 0312h;
      2. If 0x64[15:0] + 0x66[15:0] = 00000000 00000000 00000000 00011111, the next USER programming command shouldbe 0542h。

   按照上面的例子配置命令CNFG_read_command,CNFG_write_command;User_read_command,User _write_command。保存待用。

Main function:

每次的Main function操作前都需要执行Base function确定read,write command。

  a)    Read operation

  Read CNFG Section
  1. 发送CNFG_read_command 0xPP11到寄存器96h, 这里PP的值取决于要读的是哪个image,可以是 0x00、0x01、0x02、0x03 or 0x04;

  2. 循环读0x97[7] progress. 0 = in progress. 1 = done. 超过 100ms还没有done的话可以理解这次的Read失败了,需重来一次;
  3. 读 00h, 01h, 02h的值。

  Read User Section

  User 部分的读有些不一样,不同之处主要是地址访问不一样,需要先将Page_number写至0xFF这个地址,使芯片定位到对应的Page,然后将数据发送到(地址&0xFF)。

  Example:

  写0x22到地址0x420,该地址的page为4,那么先发送0x04到0XFF,再将数据0x22发送到地址0x20就实现了对地址0x420的写操作。注意这里每个Page只需要写一次               Page_number。

  1. 写User_read_command 0xPP41 到寄存器96h, 这里PP的值取决于要读的是哪个image,可以是0x00 – 0x1A (0 - 26);
  2. 循环读0x97[7] progress. 0 = in progress. 1 = done. 超过 100ms还没有done的话可以理解这次的Read失败了,需重来一次;
  3. 读 0x0000 to 0x0BFF的值。

  b)    Programming operation

  Programming CNFG Section
  1. 写CNFG data 到地址 00h, 01h, 02h;
  2. 写CNFG_write_command 0xPP12 到寄存器 96h, 这里PP的值取决于要写的是哪个image,可以是0x00, 0x01,0x02, 0x03, 0x4;

  3. 循环读0x97[7] progress. 0 = in progress. 1 = done. 超过 100ms还没有done的话可以理解这次的Programming失败了,需重来一次。

  Programming User Section

  1.写03h到寄存器94h解锁i2c的地址寄存器;

  2. Write the following registers before writing configuration data
  · Page 6 : write data 0x3F to register 0x6A
  · Page 6 : write data 0xF0 to register 0x6B
  · Page 6 : write data 0x24to register 0x6C
  · Page 6 : write data 0xF0 to register 0x6D
  · Page 10 : write data 0x3F to register 0x6A
  · Page 10 : write data 0xF0 to register 0x6B
  · Page 10 : write data 0x24 to register 0x6C
  · Page 10 : write data 0xF0 to register 0x6D
  3. Write configuration data to:
  · Page 0: 0x20 – 0x5D (register 0x20 – 0x5D)
  · Page 4 : 0x20 – 0x47 (register 0x420 – 0x447)
  · Page 6 : 0x00 – 0xFF (register 0x600 – 0x6FF)
  · Page 7 : 0x00 – 0xFF (register 0x700 – 0x7FF)
  · Page 8 : 0x20 – 0x47 (register 0x820 – 0x847)
  · Page 10 : 0x00 – 0xFF (register 0xA00 – 0xAFF)
  · Page 11 : 0x00 – 0xFF (register 0xB00 – 0xBFF)

  在进行第7步前,需要将Page_number定位到Page 0。
  4. 写User_write_command 0xPP42 到寄存器 96h, 这里PP的值取决于要写的是哪个image,可以是0x00 – 0x1A (0 - 26) 。
  8. 循环读0x97[7] progress. 0 = in progress. 1 = done. 超过 100ms还没有done的话可以理解这次的Programming失败了,需重来一次。

  

 

 

posted @ 2017-08-23 14:40  大白菜菜pp  阅读(1434)  评论(1编辑  收藏  举报