mirror of
https://github.com/halleysfifthinc/Toyota-AVC-LAN
synced 2025-06-07 16:06:12 +00:00
More send related bugfixes
This commit is contained in:
parent
1cafed82d0
commit
ff55d7e671
@ -284,6 +284,13 @@ void AVCLAN_init() {
|
|||||||
TCB1.CCMP = 0xFFFF;
|
TCB1.CCMP = 0xFFFF;
|
||||||
TCB1.CTRLA = TCB_CLKSEL | TCB_ENABLE_bm;
|
TCB1.CTRLA = TCB_CLKSEL | TCB_ENABLE_bm;
|
||||||
|
|
||||||
|
// Set PA4 and PC0 as outputs
|
||||||
|
PORTA.DIRSET = PIN4_bm;
|
||||||
|
PORTC.DIRSET = PIN0_bm;
|
||||||
|
|
||||||
|
// Set bus output pins to idle
|
||||||
|
AVC_SET_LOGICAL_1();
|
||||||
|
|
||||||
answerReq = cm_Null;
|
answerReq = cm_Null;
|
||||||
|
|
||||||
cd_Track = 1;
|
cd_Track = 1;
|
||||||
@ -331,12 +338,8 @@ void AVCLAN_sendbit_ACK() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AVC_OUT_EN();
|
|
||||||
|
|
||||||
set_AVC_logic_for(0, AVCLAN_BIT0_LOGIC_0);
|
set_AVC_logic_for(0, AVCLAN_BIT0_LOGIC_0);
|
||||||
set_AVC_logic_for(1, AVCLAN_BIT0_LOGIC_1);
|
set_AVC_logic_for(1, AVCLAN_BIT0_LOGIC_1);
|
||||||
|
|
||||||
AVC_OUT_DIS();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AVCLAN_sendbit_parity(uint8_t parity) {
|
void AVCLAN_sendbit_parity(uint8_t parity) {
|
||||||
@ -420,8 +423,9 @@ ISR(TCB0_INT_vect) {
|
|||||||
period = TCB0.CNT;
|
period = TCB0.CNT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If input was set for less than 26 us (a generous half period), bit was a 1
|
|
||||||
READING_BYTE <<= 1;
|
READING_BYTE <<= 1;
|
||||||
|
// If the logical `0` pulse was less than the sync + data period threshold,
|
||||||
|
// bit was a 1
|
||||||
pulsewidth = TCB0.CCMP;
|
pulsewidth = TCB0.CCMP;
|
||||||
if (pulsewidth < (uint16_t)AVCLAN_READBIT_THRESHOLD) {
|
if (pulsewidth < (uint16_t)AVCLAN_READBIT_THRESHOLD) {
|
||||||
READING_BYTE++;
|
READING_BYTE++;
|
||||||
@ -502,23 +506,22 @@ uint8_t AVCLAN_readbyte(uint8_t *byte) {
|
|||||||
return (parity & 1);
|
return (parity & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns true if an ACK bit was sent by the peripheral
|
||||||
uint8_t AVCLAN_readbit_ACK() {
|
uint8_t AVCLAN_readbit_ACK() {
|
||||||
TCB1.CNT = 0;
|
TCB1.CNT = 0;
|
||||||
set_AVC_logic_for(0, AVCLAN_BIT1_LOGIC_0);
|
set_AVC_logic_for(0, AVCLAN_BIT1_LOGIC_0);
|
||||||
AVC_SET_LOGICAL_1();
|
AVC_SET_LOGICAL_1();
|
||||||
AVC_OUT_DIS();
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!BUS_IS_IDLE && (TCB1.CNT > AVCLAN_READBIT_THRESHOLD))
|
if (!BUS_IS_IDLE && (TCB1.CNT > AVCLAN_READBIT_THRESHOLD))
|
||||||
break; // ACK
|
break; // ACK
|
||||||
if (TCB1.CNT > AVCLAN_BIT_LENGTH_MAX)
|
if (TCB1.CNT > AVCLAN_BIT_LENGTH_MAX)
|
||||||
return 1; // NAK
|
return 0; // NAK
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check/wait in case we get here before peripheral finishes ACK bit
|
// Check/wait in case we get here before peripheral finishes ACK bit
|
||||||
while (!BUS_IS_IDLE) {}
|
while (!BUS_IS_IDLE) {}
|
||||||
AVC_OUT_EN(); // back to write mode
|
return 1;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t CheckCmd(const AVCLAN_frame_t *frame, const uint8_t *cmd) {
|
uint8_t CheckCmd(const AVCLAN_frame_t *frame, const uint8_t *cmd) {
|
||||||
@ -682,7 +685,6 @@ uint8_t AVCLAN_readframe() {
|
|||||||
AVCLAN_printframe(&frame);
|
AVCLAN_printframe(&frame);
|
||||||
|
|
||||||
if (for_me) {
|
if (for_me) {
|
||||||
|
|
||||||
if (CheckCmd(&frame, stat1)) {
|
if (CheckCmd(&frame, stat1)) {
|
||||||
answerReq = cm_Status1;
|
answerReq = cm_Status1;
|
||||||
return 1;
|
return 1;
|
||||||
@ -699,7 +701,10 @@ uint8_t AVCLAN_readframe() {
|
|||||||
answerReq = cm_Status4;
|
answerReq = cm_Status4;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// if (CheckCmd((uint8_t*)stat5)) { answerReq = cm_Status5; return 1; }
|
// if (CheckCmd((uint8_t*)stat5)) {
|
||||||
|
// answerReq = cm_Status5;
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
if (CheckCmd(&frame, play_req1)) {
|
if (CheckCmd(&frame, play_req1)) {
|
||||||
answerReq = cm_PlayReq1;
|
answerReq = cm_PlayReq1;
|
||||||
@ -757,20 +762,33 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
|
|||||||
uint8_t parity = 0;
|
uint8_t parity = 0;
|
||||||
|
|
||||||
TCB1.CNT = 0;
|
TCB1.CNT = 0;
|
||||||
do {
|
while (BUS_IS_IDLE) {
|
||||||
while (BUS_IS_IDLE) {
|
// Wait for 120% of a bit length
|
||||||
// Wait for 120% of a bit length
|
if (TCB1.CNT >= (uint16_t)(AVCLAN_BIT_LENGTH_MAX * 2))
|
||||||
if (TCB1.CNT >= (uint16_t)(AVCLAN_BIT_LENGTH_MAX * 12 / 10))
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
if (TCB1.CNT > 864)
|
|
||||||
line_busy = 0;
|
|
||||||
} while (line_busy);
|
|
||||||
|
|
||||||
// switch to output mode
|
// End of first loop could be due to bus being driven
|
||||||
AVC_OUT_EN();
|
TCB1.CNT = 0;
|
||||||
|
if (!BUS_IS_IDLE) {
|
||||||
|
// Some other device started sending
|
||||||
|
// Can't yet simultaneously send and recieve to do proper CSMA/CD
|
||||||
|
return 1;
|
||||||
|
|
||||||
AVCLAN_sendbit_start();
|
// Beginnings of CSMA/CD
|
||||||
|
// do {
|
||||||
|
// if (TCB1.CNT >= (uint16_t)(AVCLAN_STARTBIT_LOGIC_0 * 1.2))
|
||||||
|
// return 1; // Something's hinky; nothing is longer than the start bit
|
||||||
|
// } while (!BUS_IS_IDLE);
|
||||||
|
// if (TCB1.CNT <= (uint16_t)(AVCLAN_STARTBIT_LOGIC_0 * 0.8))
|
||||||
|
// return 1; // Shouldn't be possible (waiting 2 bit lengths with idle
|
||||||
|
// bus,
|
||||||
|
// // then next bit should be a long one ie start)
|
||||||
|
// set_AVC_logic_for(1, AVCLAN_STARTBIT_LOGIC_1); // wait for end of start
|
||||||
|
// bit
|
||||||
|
} else {
|
||||||
|
AVCLAN_sendbit_start();
|
||||||
|
}
|
||||||
AVCLAN_sendbits((uint8_t *)&frame->broadcast, 1);
|
AVCLAN_sendbits((uint8_t *)&frame->broadcast, 1);
|
||||||
|
|
||||||
parity = AVCLAN_sendbits(&frame->controller_addr, 12);
|
parity = AVCLAN_sendbits(&frame->controller_addr, 12);
|
||||||
@ -779,8 +797,7 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
|
|||||||
parity = AVCLAN_sendbits(&frame->peripheral_addr, 12);
|
parity = AVCLAN_sendbits(&frame->peripheral_addr, 12);
|
||||||
AVCLAN_sendbit_parity(parity);
|
AVCLAN_sendbit_parity(parity);
|
||||||
|
|
||||||
if (!frame->broadcast && AVCLAN_readbit_ACK()) {
|
if (frame->broadcast && !AVCLAN_readbit_ACK()) {
|
||||||
AVC_OUT_DIS();
|
|
||||||
STARTEvent;
|
STARTEvent;
|
||||||
RS232_Print("Error NAK: Addresses\n");
|
RS232_Print("Error NAK: Addresses\n");
|
||||||
return 1;
|
return 1;
|
||||||
@ -789,8 +806,7 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
|
|||||||
parity = AVCLAN_sendbits(&frame->control, 4);
|
parity = AVCLAN_sendbits(&frame->control, 4);
|
||||||
AVCLAN_sendbit_parity(parity);
|
AVCLAN_sendbit_parity(parity);
|
||||||
|
|
||||||
if (!frame->broadcast && AVCLAN_readbit_ACK()) {
|
if (frame->broadcast && !AVCLAN_readbit_ACK()) {
|
||||||
AVC_OUT_DIS();
|
|
||||||
STARTEvent;
|
STARTEvent;
|
||||||
RS232_Print("Error NAK: Control\n");
|
RS232_Print("Error NAK: Control\n");
|
||||||
return 2;
|
return 2;
|
||||||
@ -799,8 +815,7 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
|
|||||||
parity = AVCLAN_sendbyte(&frame->length); // data length
|
parity = AVCLAN_sendbyte(&frame->length); // data length
|
||||||
AVCLAN_sendbit_parity(parity);
|
AVCLAN_sendbit_parity(parity);
|
||||||
|
|
||||||
if (!frame->broadcast && AVCLAN_readbit_ACK()) {
|
if (frame->broadcast && !AVCLAN_readbit_ACK()) {
|
||||||
AVC_OUT_DIS();
|
|
||||||
STARTEvent;
|
STARTEvent;
|
||||||
RS232_Print("Error NAK: Message length\n");
|
RS232_Print("Error NAK: Message length\n");
|
||||||
return 3;
|
return 3;
|
||||||
@ -812,18 +827,18 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
|
|||||||
// Based on the µPD6708 datasheet, ACK bit for broadcast doesn't seem
|
// Based on the µPD6708 datasheet, ACK bit for broadcast doesn't seem
|
||||||
// necessary (i.e. This deviates from the previous broadcast specific
|
// necessary (i.e. This deviates from the previous broadcast specific
|
||||||
// function that sent an extra `1` bit after each byte/parity)
|
// function that sent an extra `1` bit after each byte/parity)
|
||||||
if (!frame->broadcast && AVCLAN_readbit_ACK()) {
|
if (frame->broadcast && !AVCLAN_readbit_ACK()) {
|
||||||
AVC_OUT_DIS();
|
|
||||||
STARTEvent;
|
STARTEvent;
|
||||||
RS232_Print("Error ACK 4 (Data uint8_t: ");
|
RS232_Print("Error NAK (Data: ");
|
||||||
RS232_PrintDec(i);
|
RS232_PrintHex8(i);
|
||||||
RS232_Print(")\n");
|
RS232_Print(")\n");
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
// else
|
||||||
|
// AVCLAN_sendbit_1();
|
||||||
}
|
}
|
||||||
|
|
||||||
// back to read mode
|
// back to read mode
|
||||||
AVC_OUT_DIS();
|
|
||||||
STARTEvent;
|
STARTEvent;
|
||||||
|
|
||||||
if (printAllFrames)
|
if (printAllFrames)
|
||||||
|
@ -87,7 +87,7 @@ typedef struct AVCLAN_KnownMessage_struct {
|
|||||||
|
|
||||||
typedef struct AVCLAN_frame_struct {
|
typedef struct AVCLAN_frame_struct {
|
||||||
uint8_t valid;
|
uint8_t valid;
|
||||||
MSG_TYPE_t broadcast;
|
MSG_TYPE_t broadcast; // 0 for broadcast messages
|
||||||
uint16_t controller_addr; // formerly "master"
|
uint16_t controller_addr; // formerly "master"
|
||||||
uint16_t peripheral_addr; // formerly "slave"
|
uint16_t peripheral_addr; // formerly "slave"
|
||||||
uint8_t control;
|
uint8_t control;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user