naoto tanaka
/
LTC6803_Eval
BMS I/Fプログラム
main.cpp@1:5690684e5460, 2015-05-17 (annotated)
- Committer:
- NT32
- Date:
- Sun May 17 02:21:27 2015 +0000
- Revision:
- 1:5690684e5460
- Parent:
- 0:2d6ffd5a4d2e
- Child:
- 2:c7ea42f45ff5
test version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
NT32 | 0:2d6ffd5a4d2e | 1 | #include "mbed.h" |
NT32 | 0:2d6ffd5a4d2e | 2 | #include "LTC6803.h" |
NT32 | 0:2d6ffd5a4d2e | 3 | |
NT32 | 1:5690684e5460 | 4 | DigitalOut myled(LED1); |
NT32 | 1:5690684e5460 | 5 | SPI spi(p11, p12, p13); // mosi, miso, sclk |
NT32 | 1:5690684e5460 | 6 | DigitalOut cs(p15); |
NT32 | 0:2d6ffd5a4d2e | 7 | |
NT32 | 1:5690684e5460 | 8 | Serial pc(USBTX, USBRX); |
NT32 | 0:2d6ffd5a4d2e | 9 | |
NT32 | 0:2d6ffd5a4d2e | 10 | unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat); |
NT32 | 0:2d6ffd5a4d2e | 11 | |
NT32 | 0:2d6ffd5a4d2e | 12 | static unsigned char crc8_table[256]; // 8-bit table for PEC calc |
NT32 | 0:2d6ffd5a4d2e | 13 | static int made_table = 0; // table made flag |
NT32 | 0:2d6ffd5a4d2e | 14 | unsigned char packet[18]={0}; // used for PEC calc |
NT32 | 0:2d6ffd5a4d2e | 15 | unsigned char PECbyte; // PEC of a byte |
NT32 | 0:2d6ffd5a4d2e | 16 | unsigned char PECpacket; // PEC of packet |
NT32 | 0:2d6ffd5a4d2e | 17 | unsigned char PECpacketREAD; // value that PECpacket should be as read from 6803 |
NT32 | 0:2d6ffd5a4d2e | 18 | |
NT32 | 0:2d6ffd5a4d2e | 19 | static void init_crc8(); |
NT32 | 0:2d6ffd5a4d2e | 20 | void setPECbyte(unsigned char m); |
NT32 | 0:2d6ffd5a4d2e | 21 | void setPECpacket(unsigned char np); |
NT32 | 0:2d6ffd5a4d2e | 22 | |
NT32 | 0:2d6ffd5a4d2e | 23 | static void init_crc8() { |
NT32 | 0:2d6ffd5a4d2e | 24 | int z,j; |
NT32 | 0:2d6ffd5a4d2e | 25 | unsigned char cr; |
NT32 | 0:2d6ffd5a4d2e | 26 | if (!made_table) { |
NT32 | 0:2d6ffd5a4d2e | 27 | for (z = 0; z < 256; z ++) { |
NT32 | 0:2d6ffd5a4d2e | 28 | cr = z; |
NT32 | 0:2d6ffd5a4d2e | 29 | for (j = 0; j < 8; j ++) { |
NT32 | 0:2d6ffd5a4d2e | 30 | cr = (cr << 1) ^ ((cr & 0x80) ? 0x07 : 0); |
NT32 | 0:2d6ffd5a4d2e | 31 | } |
NT32 | 0:2d6ffd5a4d2e | 32 | crc8_table[z] = cr & 0xFF; |
NT32 | 0:2d6ffd5a4d2e | 33 | } |
NT32 | 0:2d6ffd5a4d2e | 34 | made_table = 1; |
NT32 | 0:2d6ffd5a4d2e | 35 | } |
NT32 | 0:2d6ffd5a4d2e | 36 | } |
NT32 | 0:2d6ffd5a4d2e | 37 | |
NT32 | 0:2d6ffd5a4d2e | 38 | void setPECbyte(unsigned char m) { |
NT32 | 0:2d6ffd5a4d2e | 39 | PECbyte = 0x41; // initialize PECbyte |
NT32 | 0:2d6ffd5a4d2e | 40 | if (!made_table) { |
NT32 | 0:2d6ffd5a4d2e | 41 | init_crc8(); |
NT32 | 0:2d6ffd5a4d2e | 42 | } |
NT32 | 0:2d6ffd5a4d2e | 43 | PECbyte = crc8_table[(PECbyte) ^ m]; |
NT32 | 0:2d6ffd5a4d2e | 44 | } |
NT32 | 0:2d6ffd5a4d2e | 45 | |
NT32 | 0:2d6ffd5a4d2e | 46 | void setPECpacket(unsigned char np) { // np is number of bytes currently in packet[] |
NT32 | 0:2d6ffd5a4d2e | 47 | int z; |
NT32 | 0:2d6ffd5a4d2e | 48 | PECpacket = 0x41; // initialize PECpacket |
NT32 | 0:2d6ffd5a4d2e | 49 | if (!made_table) { |
NT32 | 0:2d6ffd5a4d2e | 50 | init_crc8(); |
NT32 | 0:2d6ffd5a4d2e | 51 | } |
NT32 | 0:2d6ffd5a4d2e | 52 | for (z = 0; z < np; z ++) { |
NT32 | 0:2d6ffd5a4d2e | 53 | PECpacket = crc8_table[(PECpacket) ^ packet[z]]; |
NT32 | 0:2d6ffd5a4d2e | 54 | } |
NT32 | 0:2d6ffd5a4d2e | 55 | } |
NT32 | 0:2d6ffd5a4d2e | 56 | unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat){ |
NT32 | 0:2d6ffd5a4d2e | 57 | unsigned char pec; |
NT32 | 0:2d6ffd5a4d2e | 58 | char loop, outerloop; |
NT32 | 0:2d6ffd5a4d2e | 59 | datainput in; |
NT32 | 0:2d6ffd5a4d2e | 60 | in.byte = 0; |
NT32 | 0:2d6ffd5a4d2e | 61 | pec = CRCDEFAULT; |
NT32 | 0:2d6ffd5a4d2e | 62 | for(outerloop = 0; outerloop < numdat; outerloop++){ |
NT32 | 0:2d6ffd5a4d2e | 63 | for(loop = 8; loop > 0; loop--){ |
NT32 | 0:2d6ffd5a4d2e | 64 | in.in.b0 = (dat[outerloop] >> (loop - 1)) ^ ((pec >> 7)); |
NT32 | 0:2d6ffd5a4d2e | 65 | in.in.b1 = in.in.b0 ^ (pec); |
NT32 | 0:2d6ffd5a4d2e | 66 | in.in.b2 = in.in.b0 ^ (pec >> 1); |
NT32 | 0:2d6ffd5a4d2e | 67 | pec = pec << 1; |
NT32 | 0:2d6ffd5a4d2e | 68 | pec = (pec & 0xF8) | (in.byte & 0x07); |
NT32 | 0:2d6ffd5a4d2e | 69 | } |
NT32 | 0:2d6ffd5a4d2e | 70 | } |
NT32 | 0:2d6ffd5a4d2e | 71 | return pec; |
NT32 | 0:2d6ffd5a4d2e | 72 | } |
NT32 | 0:2d6ffd5a4d2e | 73 | |
NT32 | 0:2d6ffd5a4d2e | 74 | |
NT32 | 0:2d6ffd5a4d2e | 75 | |
NT32 | 0:2d6ffd5a4d2e | 76 | int main() { |
NT32 | 0:2d6ffd5a4d2e | 77 | unsigned char cmd, tmp, datnum; |
NT32 | 0:2d6ffd5a4d2e | 78 | unsigned char dat[16], getdat[16]; |
NT32 | 1:5690684e5460 | 79 | // float cellvol[4]; |
NT32 | 1:5690684e5460 | 80 | int cellvol[4]; |
NT32 | 0:2d6ffd5a4d2e | 81 | char str[32]; |
NT32 | 0:2d6ffd5a4d2e | 82 | cs = 1; |
NT32 | 0:2d6ffd5a4d2e | 83 | spi.format(8,3); |
NT32 | 1:5690684e5460 | 84 | spi.frequency(8000000); |
NT32 | 0:2d6ffd5a4d2e | 85 | pc.baud(460800); |
NT32 | 1:5690684e5460 | 86 | |
NT32 | 1:5690684e5460 | 87 | cs = 0; |
NT32 | 0:2d6ffd5a4d2e | 88 | cmd = WRCFG; |
NT32 | 0:2d6ffd5a4d2e | 89 | spi.write(cmd); |
NT32 | 0:2d6ffd5a4d2e | 90 | spi.write(CalcCRCLTC6803(&cmd, 1)); |
NT32 | 0:2d6ffd5a4d2e | 91 | dat[0] = 0x02; |
NT32 | 1:5690684e5460 | 92 | dat[1] = 0x0f; |
NT32 | 1:5690684e5460 | 93 | dat[2] = 0x00; |
NT32 | 0:2d6ffd5a4d2e | 94 | dat[3] = 0xff; |
NT32 | 1:5690684e5460 | 95 | dat[4] = 42; |
NT32 | 1:5690684e5460 | 96 | dat[5] = 255; |
NT32 | 0:2d6ffd5a4d2e | 97 | for(int loop = 0;loop < 6; loop++){ |
NT32 | 1:5690684e5460 | 98 | spi.write(dat[loop]); |
NT32 | 0:2d6ffd5a4d2e | 99 | } |
NT32 | 0:2d6ffd5a4d2e | 100 | cmd = CalcCRCLTC6803(dat, 6); |
NT32 | 0:2d6ffd5a4d2e | 101 | spi.write(cmd); |
NT32 | 1:5690684e5460 | 102 | cs = 1; |
NT32 | 1:5690684e5460 | 103 | wait(0.001); |
NT32 | 0:2d6ffd5a4d2e | 104 | while(1) { |
NT32 | 0:2d6ffd5a4d2e | 105 | cs = 0; |
NT32 | 1:5690684e5460 | 106 | cmd = RDCVA; |
NT32 | 0:2d6ffd5a4d2e | 107 | spi.write(cmd); |
NT32 | 1:5690684e5460 | 108 | spi.write(CalcCRCLTC6803(&cmd, 1)); |
NT32 | 1:5690684e5460 | 109 | for(int loop = 0;loop < 6; loop++){ |
NT32 | 1:5690684e5460 | 110 | getdat[loop] = spi.write(0); |
NT32 | 0:2d6ffd5a4d2e | 111 | } |
NT32 | 0:2d6ffd5a4d2e | 112 | cs = 1; |
NT32 | 1:5690684e5460 | 113 | wait(0.001); |
NT32 | 1:5690684e5460 | 114 | cs = 0; |
NT32 | 1:5690684e5460 | 115 | pc.printf("\033[2J"); |
NT32 | 1:5690684e5460 | 116 | pc.printf("\033[%d;%dH" , 0, 0); |
NT32 | 1:5690684e5460 | 117 | cellvol[0] = (((getdat[1] & 0x0f) << 8) | getdat[0]); |
NT32 | 1:5690684e5460 | 118 | cellvol[1] = ((getdat[2] << 4) | ((getdat[1] & 0xf0) >> 4)); |
NT32 | 1:5690684e5460 | 119 | cellvol[2] = (((getdat[4] & 0x0f) << 8) | getdat[3]); |
NT32 | 1:5690684e5460 | 120 | cellvol[3] = ((getdat[5] << 4) | ((getdat[4] & 0xf0) >> 4)); |
NT32 | 1:5690684e5460 | 121 | |
NT32 | 1:5690684e5460 | 122 | for(int loop = 0;loop < 4; loop++){ |
NT32 | 1:5690684e5460 | 123 | pc.printf("Cell%d = %6d\n", loop, cellvol[loop]); |
NT32 | 0:2d6ffd5a4d2e | 124 | } |
NT32 | 1:5690684e5460 | 125 | |
NT32 | 1:5690684e5460 | 126 | cmd = STCVADALL; |
NT32 | 1:5690684e5460 | 127 | |
NT32 | 1:5690684e5460 | 128 | spi.write(cmd); |
NT32 | 1:5690684e5460 | 129 | spi.write(CalcCRCLTC6803(&cmd, 1)); |
NT32 | 1:5690684e5460 | 130 | cs = 1; |
NT32 | 0:2d6ffd5a4d2e | 131 | myled = !myled; |
NT32 | 1:5690684e5460 | 132 | wait(0.4); |
NT32 | 0:2d6ffd5a4d2e | 133 | } |
NT32 | 0:2d6ffd5a4d2e | 134 | } |