Начало

This commit is contained in:
cfif 2026-03-13 16:25:26 +03:00
parent 238e5d74da
commit e5a3b543e0
2 changed files with 66 additions and 133 deletions

View File

@ -42,7 +42,7 @@ typedef struct {
osMessageQueueId_t rxDataSnifferQueue0; osMessageQueueId_t rxDataSnifferQueue0;
osMessageQueueId_t rxDataSnifferQueue1; osMessageQueueId_t rxDataSnifferQueue1;
osMessageQueueId_t txAccessQueue; osMessageQueueId_t txAccessQueue[3];
} tCanSerialPortFrameArtery; } tCanSerialPortFrameArtery;

View File

@ -5,6 +5,8 @@
#include "CanSerialPortFrame.h" #include "CanSerialPortFrame.h"
#include "memory.h" #include "memory.h"
#include "at32f435_437_misc.h" #include "at32f435_437_misc.h"
#include "FreeRTOSConfig.h"
static void vCanSerialPortFrameInitNVICEnable(can_type *CANx, uint8_t irqSubPriority) { static void vCanSerialPortFrameInitNVICEnable(can_type *CANx, uint8_t irqSubPriority) {
@ -106,6 +108,10 @@ void vCanSerialPortFrameInit(
env->can = CANx; env->can = CANx;
env->txAccessQueue[0] = osMutexNew(NULL);
env->txAccessQueue[1] = osMutexNew(NULL);
env->txAccessQueue[2] = osMutexNew(NULL);
if (!env->reInit) { if (!env->reInit) {
env->reInit = true; env->reInit = true;
vCanSerialPortFrameInitStructure(env, CANx, rxBufferLength0, rxSnifferLength0, rxBufferLength1, vCanSerialPortFrameInitStructure(env, CANx, rxBufferLength0, rxSnifferLength0, rxBufferLength1,
@ -467,7 +473,13 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *da
} }
*/ */
uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *data, uint16_t size, uint32_t timeout) {
uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *data, uint16_t size, uint32_t adr,
uint8_t canType, uint8_t mailBox, uint32_t timeout) {
configASSERT(mailBox < 3);
if (osMutexAcquire(env->txAccessQueue[mailBox], 1000) == osOK) {
uint16_t sent = 0; uint16_t sent = 0;
uint32_t endMs = SystemGetMs() + timeout; uint32_t endMs = SystemGetMs() + timeout;
@ -478,15 +490,15 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *da
can_tx_message_type TxMessage; can_tx_message_type TxMessage;
if (env->canTypeFrame == CAN_STD_ID) { if (canType == CAN_STD_ID) {
TxMessage.standard_id = env->id; TxMessage.standard_id = adr;
TxMessage.extended_id = 0; TxMessage.extended_id = 0;
TxMessage.id_type = CAN_ID_STANDARD; TxMessage.id_type = CAN_ID_STANDARD;
} }
if (env->canTypeFrame == CAN_EXT_ID) { if (canType == CAN_EXT_ID) {
TxMessage.standard_id = 0; TxMessage.standard_id = 0;
TxMessage.extended_id = env->id; TxMessage.extended_id = adr;
TxMessage.id_type = CAN_ID_EXTENDED; TxMessage.id_type = CAN_ID_EXTENDED;
} }
@ -501,12 +513,13 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *da
memcpy(TxMessage.data, &data[len], 8); memcpy(TxMessage.data, &data[len], 8);
len += 8; len += 8;
transmit_mailbox = can_message_transmitExt(env->can, &TxMessage, CAN_TX_MAILBOX0); transmit_mailbox = can_message_transmitExt(env->can, &TxMessage, mailBox);
while (can_transmit_status_get(env->can, (can_tx_mailbox_num_type) transmit_mailbox) != while (can_transmit_status_get(env->can, (can_tx_mailbox_num_type) transmit_mailbox) !=
CAN_TX_STATUS_SUCCESSFUL) { CAN_TX_STATUS_SUCCESSFUL) {
if (!((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) { if (!((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) {
osMutexRelease(env->txAccessQueue[mailBox]);
return sent; return sent;
} }
@ -526,7 +539,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *da
TxMessage.dlc = tailSize; TxMessage.dlc = tailSize;
memcpy(TxMessage.data, &data[len], tailSize); memcpy(TxMessage.data, &data[len], tailSize);
transmit_mailbox = can_message_transmitExt(env->can, &TxMessage, CAN_TX_MAILBOX0); transmit_mailbox = can_message_transmitExt(env->can, &TxMessage, mailBox);
can_transmit_status_type status = can_transmit_status_get(env->can, can_transmit_status_type status = can_transmit_status_get(env->can,
(can_tx_mailbox_num_type) transmit_mailbox); (can_tx_mailbox_num_type) transmit_mailbox);
@ -536,6 +549,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *da
status = can_transmit_status_get(env->can, (can_tx_mailbox_num_type) transmit_mailbox); status = can_transmit_status_get(env->can, (can_tx_mailbox_num_type) transmit_mailbox);
if (!((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) { if (!((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) {
osMutexRelease(env->txAccessQueue[mailBox]);
return sent; return sent;
} }
@ -547,90 +561,11 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameArtery *env, uint8_t *da
} }
osMutexRelease(env->txAccessQueue[mailBox]);
return sent; return sent;
} else {
return 0;
} }
uint16_t vCanSerialPortFrameTransmit1(tCanSerialPortFrameArtery *env, uint8_t *data, uint16_t size, uint32_t timeout) {
uint16_t sent = 0;
uint32_t endMs = SystemGetMs() + timeout;
uint16_t fullSize = size / 8;
uint8_t tailSize = size % 8;
uint8_t transmit_mailbox;
can_tx_message_type TxMessage;
if (env->canTypeFrame == CAN_STD_ID) {
TxMessage.standard_id = env->id1;
TxMessage.extended_id = 0;
TxMessage.id_type = CAN_ID_STANDARD;
}
if (env->canTypeFrame == CAN_EXT_ID) {
TxMessage.standard_id = 0;
TxMessage.extended_id = env->id1;
TxMessage.id_type = CAN_ID_EXTENDED;
}
TxMessage.frame_type = CAN_TFT_DATA;
TxMessage.dlc = 8;
while (size && ((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) {
uint16_t len = 0;
for (uint16_t i = 0; i < fullSize; ++i) {
memcpy(TxMessage.data, &data[len], 8);
len += 8;
transmit_mailbox = can_message_transmitExt(env->can, &TxMessage, CAN_TX_MAILBOX1);
while (can_transmit_status_get(env->can, (can_tx_mailbox_num_type) transmit_mailbox) !=
CAN_TX_STATUS_SUCCESSFUL) {
if (!((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) {
return sent;
}
// if ((can_flag_get(env->can, CAN_BOF_FLAG) != RESET) ||
// (can_flag_get(env->can, CAN_EPF_FLAG) != RESET) ||
// (can_flag_get(env->can, CAN_EAF_FLAG) != RESET)) {
// return sent;
// }
}
sent += 8;
size -= 8;
}
if (tailSize) {
TxMessage.dlc = tailSize;
memcpy(TxMessage.data, &data[len], tailSize);
transmit_mailbox = can_message_transmitExt(env->can, &TxMessage, CAN_TX_MAILBOX1);
can_transmit_status_type status = can_transmit_status_get(env->can,
(can_tx_mailbox_num_type) transmit_mailbox);
while (status != CAN_TX_STATUS_SUCCESSFUL) {
status = can_transmit_status_get(env->can, (can_tx_mailbox_num_type) transmit_mailbox);
if (!((timeout == SystemWaitForever) || (endMs > SystemGetMs()))) {
return sent;
}
}
sent += tailSize;
size -= tailSize;
}
}
return sent;
} }
tSerialPortFrameIO CanPortFrame_GetIo(tCanSerialPortFrameArtery *env) { tSerialPortFrameIO CanPortFrame_GetIo(tCanSerialPortFrameArtery *env) {
@ -638,8 +573,7 @@ tSerialPortFrameIO CanPortFrame_GetIo(tCanSerialPortFrameArtery *env) {
.env = env, .env = env,
.receive0 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceive0, .receive0 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceive0,
.receive1 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceive1, .receive1 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceive1,
.transmit = (SerialPortFrameIOTransaction) vCanSerialPortFrameTransmit, .transmit = (SerialPortFrameIOTransmitTransaction) vCanSerialPortFrameTransmit,
.transmit1 = (SerialPortFrameIOTransaction) vCanSerialPortFrameTransmit1
}; };
return io; return io;
} }
@ -649,8 +583,7 @@ tSerialPortFrameIO CanPort_GetSnifferIo(tCanSerialPortFrameArtery *env) {
.env = env, .env = env,
.receive0 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceiveSniffer0, .receive0 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceiveSniffer0,
.receive1 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceiveSniffer1, .receive1 = (SerialPortFrameIOTransaction) vCanSerialPortFrameReceiveSniffer1,
.transmit = (SerialPortFrameIOTransaction) vCanSerialPortFrameTransmit, .transmit = (SerialPortFrameIOTransmitTransaction) vCanSerialPortFrameTransmit,
.transmit1 = (SerialPortFrameIOTransaction) vCanSerialPortFrameTransmit1
}; };
return io; return io;
} }