Communication Issue between LTC6811-1 and LTC3300-1 via SPI

Dear Colleagues from ADI,

I've frustrated by this communication failure for quite long time, help from you is appreciated.

SPI from LTC6811-1 can send out waveforms correctly and the code is as follow, but all two LTC3300-1 has no response(can’t detect driven waveform on gate pins of MOSFETs).

The data sending to LTC3300 consists of:

1) Command byte: 0xa9

 

2) Two balancing data bytes: 0x00, 0x84

 

3) One more command byte to execute balance, 0xaf

 

So LTC68111-1 sends four bytes to LTC3300-1 to execute a balancing action, but the COMM register of LTC6811-1 can only be filled with 3 bytes at one time, there’s one more byte(0xaf) I need to send it separately as the code shows:

 

Testing Data:

//writing COMM register,including command byte and two balancing bytes,to be invoked by case 21

test_ic0[TOTAL_IC].com.tx_data[0] =0x8a;  

test_ic0[TOTAL_IC].com.tx_data[1] =0x90;  //command byte 0xa9,keeping CSB as low

test_ic0[TOTAL_IC].com.tx_data[2] =0x80;

test_ic0[TOTAL_IC].com.tx_data[3] =0x00; //first balancing date byte 0x00,keeping CSB as low

test_ic0[TOTAL_IC].com.tx_data[4] =0x88;

test_ic0[TOTAL_IC].com.tx_data[5] =0x49; //second balancing date byte, x84,pull CSB to high (I've tried keeping CSB as low, but still the same)

// writing COMM register,including command byte, to be invoked by case 22

test_ic1[TOTAL_IC].com.tx_data[0] =0x8a;

test_ic1[TOTAL_IC].com.tx_data[1] =0xf9; // command byte 0xaf,pull CSB to high

test_ic1[TOTAL_IC].com.tx_data[2] =0xff;

test_ic1[TOTAL_IC].com.tx_data[3] =0xf9;  //no more date needs to be sent, so fill with 0xf and pull CSB to high

test_ic1[TOTAL_IC].com.tx_data[4] =0xff;

test_ic1[TOTAL_IC].com.tx_data[5] =0xf9;  //no more date needs to be sent, so fill with 0xf and pull CSB to high (also tried keeping CSB as low till the last byte)

 

Crop from Main loop:     

 case 21:       

wakeup_sleep(TOTAL_IC);       //write banlance cmd and data       

LTC6811_wrcomm(TOTAL_IC,test_ic0);    

LTC6811_stcomm();          

break;     

case 22:       

wakeup_sleep(TOTAL_IC);       //excute banlance cmd       

LTC6811_wrcomm(TOTAL_IC,test_ic1);       

LTC6811_stcomm();           

break;

 

 

 The circuitry is referred from DEMO board and there’s pull-up resistors at GPIO3~5 pins of LTC6811(also wrote 1 to corresponding GPIOx bits).

There’s waveforms can be detected at the LOW side LTC3300-1, but no waves between the two LTC3300-1s. Looking at the mechanism of LT3300-1 system, the commands shall be sent to the HIGH side one at first, then to the LOW side one. Does that mean my system is not functioning at all? Please help where is the problem.

 thanks,

minggang

  • +1
    •  Analog Employees 
    on Nov 22, 2018 7:10 AM over 2 years ago

    Hi,

    I am assuming that your CRC for your data is right.

    I checked the code you are implementing and I noticed that for every INCOMM you are sending command for making chip select low.

    You have to send the chip select low only at starting and for remaining INCOMM bits you can set it to 0.

    And before sending the extra one bit , it is recommended for you to not make the CSB high. you should always keep the CSB low for whole communication.

    I have attached a screen shot for the configuration of COMM register in 6811.

     

    Thanks,

  • thanks for your prompt reply, as you pointed out, I've modified the bits with underline,

    test_ic0[TOTAL_IC].com.tx_data[0] =0x8a;
    test_ic0[TOTAL_IC].com.tx_data[1] =0x90;

    test_ic0[TOTAL_IC].com.tx_data[2] =0xa0;
    test_ic0[TOTAL_IC].com.tx_data[3] =0x00;

    test_ic0[TOTAL_IC].com.tx_data[4] =0xa8;
    test_ic0[TOTAL_IC].com.tx_data[5] =0x40;      also as you suggested, the last four bits should be 0(keeping csb as low), right?

    for the extra data byte, there are two useless bytes following, would be it ok like such?

    test_ic1[TOTAL_IC].com.tx_data[0] =0xaa;
    test_ic1[TOTAL_IC].com.tx_data[1] =0xf9;  //set csb to high
    test_ic1[TOTAL_IC].com.tx_data[2] =0xff;   //useless byte
    test_ic1[TOTAL_IC].com.tx_data[3] =0xf9;
    test_ic1[TOTAL_IC].com.tx_data[4] =0xff;   //useless byte
    test_ic1[TOTAL_IC].com.tx_data[5] =0xf9;

    thanks again for helping.

    minggang

  • 0
    •  Analog Employees 
    on Nov 22, 2018 8:56 AM over 2 years ago in reply to yemingxp

    Yes, this looks fine.

    Are you able to establish communication.

    Thanks

  • Hello Harshit,

    Please take a look of the waveform I captured.

    The data sent is the same as the last post, the execution code is as follow:

    case 21:
    wakeup_sleep(TOTAL_IC);
    //write banlance cmd and data
    LTC6811_wrcomm(TOTAL_IC,test_ic0);
    LTC6811_stcomm();

    //the fourth byte
    LTC6811_wrcomm(TOTAL_IC,test_ic1);
    LTC6811_stcomm();

     Looking at the waveform there are two sections, the CS is not LOW at the left section but is LOW at the right section.

     Is this caused by error CRC or something? But I've checked the CRC which should be right.

    thanks,

    minggang