![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
BMS I/Fプログラム
main.cpp
- Committer:
- NT32
- Date:
- 2015-01-12
- Revision:
- 0:2d6ffd5a4d2e
- Child:
- 1:5690684e5460
File content as of revision 0:2d6ffd5a4d2e:
#include "mbed.h" #include "LTC6803.h" DigitalOut myled(P2_17); SPI spi(P0_9, P0_8, P1_29); // mosi, miso, sclk DigitalOut cs(P0_2); Serial pc(P0_19, P0_18); unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat); static unsigned char crc8_table[256]; // 8-bit table for PEC calc static int made_table = 0; // table made flag unsigned char packet[18]={0}; // used for PEC calc unsigned char PECbyte; // PEC of a byte unsigned char PECpacket; // PEC of packet unsigned char PECpacketREAD; // value that PECpacket should be as read from 6803 static void init_crc8(); void setPECbyte(unsigned char m); void setPECpacket(unsigned char np); static void init_crc8() { int z,j; unsigned char cr; if (!made_table) { for (z = 0; z < 256; z ++) { cr = z; for (j = 0; j < 8; j ++) { cr = (cr << 1) ^ ((cr & 0x80) ? 0x07 : 0); } crc8_table[z] = cr & 0xFF; } made_table = 1; } } void setPECbyte(unsigned char m) { PECbyte = 0x41; // initialize PECbyte if (!made_table) { init_crc8(); } PECbyte = crc8_table[(PECbyte) ^ m]; } void setPECpacket(unsigned char np) { // np is number of bytes currently in packet[] int z; PECpacket = 0x41; // initialize PECpacket if (!made_table) { init_crc8(); } for (z = 0; z < np; z ++) { PECpacket = crc8_table[(PECpacket) ^ packet[z]]; } } unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat){ unsigned char pec; char loop, outerloop; datainput in; in.byte = 0; pec = CRCDEFAULT; for(outerloop = 0; outerloop < numdat; outerloop++){ for(loop = 8; loop > 0; loop--){ in.in.b0 = (dat[outerloop] >> (loop - 1)) ^ ((pec >> 7)); in.in.b1 = in.in.b0 ^ (pec); in.in.b2 = in.in.b0 ^ (pec >> 1); pec = pec << 1; pec = (pec & 0xF8) | (in.byte & 0x07); } } return pec; } int main() { unsigned char cmd, tmp, datnum; unsigned char dat[16], getdat[16]; char str[32]; cs = 1; spi.format(8,3); spi.frequency(50000); pc.baud(460800); cmd = WRCFG; spi.write(cmd); spi.write(CalcCRCLTC6803(&cmd, 1)); dat[0] = 0x02; dat[1] = 0x00; dat[2] = 0xf0; dat[3] = 0xff; dat[4] = 0x00; dat[5] = 0x00; for(int loop = 0;loop < 6; loop++){ spi.write(dat[loop]) } cmd = CalcCRCLTC6803(dat, 6); spi.write(cmd); while(1) { pc.printf("cmd in\n"); pc.scanf("%x", &cmd); cs = 0; pc.printf("dat num\n"); pc.scanf("%d", &datnum); for(tmp = 0;tmp < datnum; tmp++){ pc.printf("dat num[%d]\n", (tmp)); pc.scanf("%s", str); dat[tmp] = strtol(str, NULL, 16); } spi.write(cmd); // pc.printf("%X\n", cmd); cmd = CalcCRCLTC6803(&cmd, 1); spi.write(cmd); // pc.printf("%X\n", cmd); for(tmp = 0; tmp < datnum; tmp++){ getdat[tmp] = spi.write(dat[tmp]); // pc.printf("dat[%X] = %X\n", tmp, dat[tmp]); } cmd = CalcCRCLTC6803(dat, datnum); spi.write(cmd); cs = 1; for(tmp = 0; tmp < datnum; tmp++){ pc.printf("get[%d] = %x\n", tmp, getdat[tmp]); } myled = !myled; } }