How to connect a Host-controlled battery charger to BBB using I2C ?

I have a battery charger : http://www.ti.com/tool/BQ24261EVM-079?keyMatch=bq24261evm-079&tisearch=Search-EN-Everything

and I want to program it using the BBB I2C. Can I get any code sample to proceed or any guidance ?

Hi Chintan,

I don’t use I2C to control the charger, but I do use it to talk to the power monitor and the supervisor. Our code for the host-side I2C utilities are on Github and should make a reasonable example.

-Ron

Hey Ron,

Your work at andicelabs.com seems fantastic. Long live Open source :slight_smile:

Just to be clear about my question, I want to power a battery using the TI battery charger board, BQ24261 and I want to control (program) the charger board using a Beaglebone black. Reading the datasheet of the charging board, I found that, it can be controlled via a GUI, that can be accessed by interfacing the charging board to a PC using a USB-GPIO interface board.

In absence of the said board, and with the need to programmatically set the charging voltage for my battery, I plan to use the BBB.

Your code in powercape.c is quite exhaustive, I wanted to further know, whether I will need any additional hardware to connect the charging board to BBB, and any other information / source relevant to this topic.

  • Thanks
    Chintan Pathak

Your original question seemed to be more about I2C code examples. Anyway, I don’t see any reason why you can’t do what you’re asking. The eval board’s I2C interface is brought out to a header and you’d just hook that up to the bone’s I2C bus (be sure to also connect the boards’ grounds together). The eval board doesn’t make any assumptions about power so there are no I2C pull-ups on it. If you need to add pull-ups to the I2C lines, be sure to use 3v3 from the bone’s header.

While not 100% relevant, I have two I2C posts here and here with simpler examples.

-Ron

Hey Ron,

You have been super-helpful, and I believe together we have nearly cracked it.

I am beginning to get a feel for I2C and I have come up with a schematic for connection, which I present below for review and comments.

I plan to use pull-ups of 47k each and a supply of 3.3V from BBB.

I have also requested help from TI-E2E, but I wanted to know, if this voltage is sufficient / proper for our charger ?

Also, how can I get the address of our EVM (charger) for use in the code as in your # define statement in this example http://andicelabs.com/2013/06/linux-using-i2c-from-user-land/ ?

Will let you know how this goes.

  • Thanks

Chintan Pathak

Your source for all things bq24261 will be the datasheet. It describes the registers, how to use them, and gives you the I2C address at the bottom of page 27. The bq24261 will work fine with a 3.3V I2C interface. It will get it’s own internal power from the DC source used for battery charging (on eval board J1). Eval board documentation is here.

My drawing would probably look more like:
BBB SCL <–> SCL (J15)
BBB SDA <–> SDA (J15)
BBB GND <–> GND (J15)

Add pull-ups between SCL <-> BBB 3V3, and SDA <-> BBB 3V3. I’d probably use 10k. Then, it’s all software.

-Ron

Whoever said - reading the datasheet goes a long way, was not lying. :slight_smile:

So I read it, twice, and found it quite enlightening. To summarise: I found out how to set the Battery Regulation voltage and charge current, thanks to register descriptions on page number 33-35, which use the formula

VBATREG = 3.5 V + VBREGCODE × 20 mV

and ICHARGE = 500 mA + ICHRGCODE × 100 mA

Also, I found the address of the EVM for referring in my BBB I2C code as : 0x6B (1101011 in binary) .

Now, I am left with two, seemingly non-trivial questions,

  1. How to do I write to the registers like the Status/Control Register with a memory location of 00, Control/Battery Voltage Register with a memory location of 02, etc. I learnt direct register manipulation (DRM) but then experts suggested that using API function calls is a safer method to use than DRM (I dont think such API functions are available for BQ-24261, there was a mention of a public library here https://lkml.org/lkml/headers/2015/9/6/91 but I couldnt locate the actual header file) , so I am not as thorough with the process. A two line snippet would really help in clarifying the concepts.

  2. Choice of functional mode:Section 9.4 of datasheet, lists details about 19 possible functional modes for operating the EVM. Which of these is the suggested one ? I understand that this might be application specific, but any pointers on this selection, or this is done implicitly by setting the appropriate registers through the above step.

  • Thanks
    Chintan Pathak

So, I got to a code, that works, https://github.com/chintanp/i2c-charger/blob/master/charger.c

It updates the voltage delivered by the charger every few seconds, similarly other parameters like the charging current can be tweaked.

Thanks a lot to all the folks, :wink: