hello
main.cpp
- Committer:
- GeofferyOmlette
- Date:
- 2014-07-14
- Revision:
- 0:f2ba1ee4ee06
File content as of revision 0:f2ba1ee4ee06:
#include "mbed.h"
#include <vector>
Serial pc(USBTX, USBRX); // tx, rx
Serial c2c(p13, p14); // tx, rx
DigitalInOut nREQ(p15);
DigitalInOut nRDY(p16);
// Fletcher checksum calculation, not optimised
static uint16_t checkSum(uint8_t length_byte, uint8_t* buf){
// length is treated as 16-bit for checksum calculation
uint16_t sum1 = length_byte % 255;
uint16_t sum2 = sum1;
for (int i = 0; i < length_byte; i++) {
sum1 = (sum1 + buf[i]) % 255;
sum2 = (sum2 + sum1) % 255;
}
return ((sum2 << 8) | sum1);
}
void sendTestPacket(){
pc.printf("\n\rTX: wait for nRDY... ");
nREQ = 0;
nREQ.mode(PinMode(OpenDrain));
nREQ.output();
nRDY = 1;
nRDY.input();
// wait for nRDY
while(nRDY == 1)
wait(0.1);
pc.printf("\n\rgot nRDY\n\r");
const uint8_t len = 0;
c2c.putc(len);
while(!c2c.writeable())
;
pc.printf("wrote len=%d\n\r", len);
uint8_t data[len==0? 256 : len];
for(int i = 0; i < (len==0? 256 : len); i++){
data[i] = uint8_t((i + 31) & 0xff);
c2c.putc(data[i]);
pc.printf(".");
while(!c2c.writeable())
;
}
pc.printf("\n\rwrote data\n\r", len);
uint16_t csum = checkSum(len, data);
c2c.putc(uint8_t(csum & 0xff));
while(!c2c.writeable())
;
c2c.putc(uint8_t((csum >> 8) & 0xff));
pc.printf("\n\rwrote checksum\n\r", len);
}
void receiveTestPacket(){
pc.printf("RX: wait for nREQ...");
nREQ = 0;
nRDY = 0;
nREQ.mode(PinMode(OpenDrain | PullUp));
nRDY.mode(PinMode(OpenDrain | PullUp));
nREQ.output();
nRDY.output();
// nREQ.input();
// nRDY = 1;
// nRDY.mode(PinMode(OpenDrain));
while(nREQ == 0)
wait(0.1);
pc.printf("\n\rgot REQ\n\r");
nRDY = 1;
int len = c2c.getc();
std::vector<uint8_t> msg;
for(int i = 0; i < len; i++)
msg.push_back(c2c.getc());
uint16_t csum = 0;
for(int i =0; i < 2; i++)
csum |= (uint16_t(c2c.getc()) << (i*8));
pc.printf("len=%d\n\r", len);
for(int i = 0; i < len; i++)
pc.printf("0x%x ", msg[i]);
pc.printf("\n\rcsum : 0x%x\n\r", csum);
uint16_t check_checksum = checkSum(len, &msg[0]);
pc.printf("check: 0x%x\n\r", check_checksum);
nRDY = 0;
}
int main() {
pc.printf("\n\r--------\n\rc2c UART Test\n\r");
c2c.baud(38400);
// while(1) {
// if(c2c.readable()) {
// pc.putc(c2c.getc());
// }
// }
if(c2c.readable())
pc.printf("Leftover characters:");
while(c2c.readable())
pc.printf("0x%x ", int(c2c.getc()));
pc.printf("\n\r");
// receive rx_count things
int rx_count = 1;
while(rx_count > 0){
receiveTestPacket();
}
// sendTestPacket();
//
pc.printf("\n\r--- complete ---\n\r");
}