начало измнений для аппаратноо кан:

- без ошибок работает аппаратный кан
- с ошибками - программный
This commit is contained in:
Razvalyaev 2025-08-08 11:57:34 +03:00
parent 7a7f838a4a
commit f85acb03a9
11 changed files with 400 additions and 262 deletions

33
Core/CANEmu/canConfig.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef CANCONFIG_H
#define CANCONFIG_H
#define CAN_ONLY_EMULATING
// Настройки GPIO и таймера
#define CANEMU_TX_GPIO_PORT GPIOA
#define CANEMU_TX_GPIO_PIN 12
#define CANEMU_TIM TIM2
#define CANEMU_TIM_US_TICKS 72 // Для 1 мкс при 72 МГц
#define CANEMU_TIM_CLOCK_HZ 72000000UL // частота таймера
#define CAN_MIN_PERIOD 20
#define LED_WORKING(on_off) \
do { \
if (!on_off) GPIOC->ODR |= (1U << 13); \
else GPIOC->ODR &= ~(1U << 13); \
} while (0)
// === Макросы управления GPIO ===
#define can_tx_set_1() (CANEMU_TX_GPIO_PORT->BSRR = (1U << CANEMU_TX_GPIO_PIN))
#define can_tx_set_0() (CANEMU_TX_GPIO_PORT->BRR = (1U << CANEMU_TX_GPIO_PIN))
// === Макросы управления таймером ===
#define tim_reset(TIM) ((TIM)->CNT = 0)
#define tim_get(TIM) ((uint16_t)(TIM)->CNT)
#define tim_start(TIM) ((TIM)->CR1 |= TIM_CR1_CEN)
#define tim_stop(TIM) ((TIM)->CR1 &= ~TIM_CR1_CEN)
#endif // CANEMU_H

View File

@ -1,12 +1,8 @@
#include "canEmu.h" #include "canEmu.h"
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
#include "rs_message.h"
volatile uint32_t CANEMU_BIT_TICKS = 0; volatile uint32_t CANEMU_BIT_TICKS = 0;
CANEmu_HandleTypeDef hcanemu;
int flag_manual = 0;
int transmit_prev = 0;
static void delay_us(uint32_t us) { static void delay_us(uint32_t us) {
uint32_t ticks = us * CANEMU_TIM_US_TICKS; uint32_t ticks = us * CANEMU_TIM_US_TICKS;
@ -29,7 +25,7 @@ void CANEmu_Init(CANEmu_HandleTypeDef *canemu, uint32_t bitrate) {
GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0};
/*Configure GPIO pin : PB0 */ /*Configure GPIO pin */
GPIO_InitStruct.Pin = (1<<CANEMU_TX_GPIO_PIN); GPIO_InitStruct.Pin = (1<<CANEMU_TX_GPIO_PIN);
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
@ -45,6 +41,7 @@ void CANEmu_Init(CANEmu_HandleTypeDef *canemu, uint32_t bitrate) {
canemu->bitrate_bps = bitrate; canemu->bitrate_bps = bitrate;
tim_start(CANEMU_TIM); tim_start(CANEMU_TIM);
can_tx_set_1(); // Recessive level can_tx_set_1(); // Recessive level
canemu->EmuFlag = 1;
} }
void wait_exact_ticks(uint16_t target_ticks) { void wait_exact_ticks(uint16_t target_ticks) {
@ -87,60 +84,3 @@ void CANEmu_SendFrame(CANEmu_HandleTypeDef *canemu) {
LED_WORKING(0); LED_WORKING(0);
#endif #endif
} }
void CANEmu_Working(CANEmu_HandleTypeDef *canemu)
{
if(flag_manual == 0)
{
canemu->start_poll = MB_DATA.Coils.START_POLLING;
canemu->transmit = MB_DATA.Coils.START_SINGLE_FRAME;
canemu->period_ms = MB_DATA.HoldRegs.CAN_PERIOD;
if(canemu->period_ms < CAN_MIN_PERIOD)
{
canemu->period_ms = CAN_MIN_PERIOD;
}
// can message
canemu->header.IDE = MB_DATA.Coils.HEADER_IDE;
canemu->header.RTR = MB_DATA.Coils.HEADER_RTR;
canemu->bitrate_bps = (uint32_t)MB_DATA.HoldRegs.CAN_BITRATE_KBPS*1000;
canemu->header.ExtId = ((uint32_t)MB_DATA.HoldRegs.CAN_ID_HI << 16) | MB_DATA.HoldRegs.CAN_ID_LO;
canemu->header.StdId = canemu->header.ExtId;
canemu->header.DLC = (uint8_t)MB_DATA.HoldRegs.CAN_DLC & 0xF;
canemu->data[0] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_0;
canemu->data[1] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_1;
canemu->data[2] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_2;
canemu->data[3] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_3;
canemu->data[4] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_4;
canemu->data[5] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_5;
canemu->data[6] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_6;
canemu->data[7] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_7;
// errors
canemu->errors.FF_SRS = MB_DATA.Coils.FLIP_SRS;
canemu->errors.FF_IDE = MB_DATA.Coils.FLIP_IDE;
canemu->errors.FF_RTR = MB_DATA.Coils.FLIP_RTR;
canemu->errors.FF_R1 = MB_DATA.Coils.FLIP_R1;
canemu->errors.FF_R0 = MB_DATA.Coils.FLIP_R0;
canemu->errors.MSGID = MB_DATA.Coils.FLIP_MSGID_BIT;
canemu->errors.DATA = MB_DATA.Coils.FLIP_DATA_BIT;
canemu->errors.CRC_ERR = MB_DATA.Coils.FLIP_CRC_BIT;
canemu->errors.STUFF_BITS = MB_DATA.Coils.DISABLE_STUFF_BITS;
}
if(canemu->start_poll)
{
canemu->transmit = 0;
HAL_Delay(canemu->period_ms);
CANEmu_SendFrame(&hcanemu);
}
else if((canemu->transmit == 1) && (transmit_prev == 0))
{
CANEmu_SendFrame(&hcanemu);
}
transmit_prev = canemu->transmit;
}

View File

@ -3,30 +3,7 @@
#include "canform.h" #include "canform.h"
#include "tim.h" #include "tim.h"
#include "canConfig.h"
// Настройки GPIO и таймера
#define CANEMU_TX_GPIO_PORT GPIOB
#define CANEMU_TX_GPIO_PIN 0
#define CANEMU_TIM TIM2
#define CANEMU_TIM_US_TICKS 72 // Для 1 мкс при 72 МГц
#define CANEMU_TIM_CLOCK_HZ 72000000UL // частота таймера
#define CAN_MIN_PERIOD 20
#define LED_WORKING(on_off) \
do { \
if (!on_off) GPIOC->ODR |= (1U << 13); \
else GPIOC->ODR &= ~(1U << 13); \
} while (0)
// === Макросы управления GPIO ===
#define can_tx_set_1() (CANEMU_TX_GPIO_PORT->BSRR = (1U << CANEMU_TX_GPIO_PIN))
#define can_tx_set_0() (CANEMU_TX_GPIO_PORT->BRR = (1U << CANEMU_TX_GPIO_PIN))
// === Макросы управления таймером ===
#define tim_reset(TIM) ((TIM)->CNT = 0)
#define tim_get(TIM) ((uint16_t)(TIM)->CNT)
#define tim_start(TIM) ((TIM)->CR1 |= TIM_CR1_CEN)
#define tim_stop(TIM) ((TIM)->CR1 &= ~TIM_CR1_CEN)
typedef struct typedef struct
{ {
@ -37,6 +14,7 @@ typedef struct
uint32_t transmit; uint32_t transmit;
uint32_t period_ms; uint32_t period_ms;
CAN_ErrorFlags_t errors; CAN_ErrorFlags_t errors;
unsigned EmuFlag;
}CANEmu_HandleTypeDef; }CANEmu_HandleTypeDef;
extern CANEmu_HandleTypeDef hcanemu; extern CANEmu_HandleTypeDef hcanemu;

97
Core/CANEmu/canWorking.c Normal file
View File

@ -0,0 +1,97 @@
#include "canWorking.h"
CANEmu_HandleTypeDef hcanemu;
uint32_t mbox;
CANEmu_HandleTypeDef hcanemu;
int flag_manual = 0;
int transmit_prev = 0;
void CAN_Init(CANEmu_HandleTypeDef *canemu)
{
#ifdef CAN_ONLY_EMULATING
CANEmu_SendFrame(canemu);
if(canemu->EmuFlag == 0)
{
CANEmu_Init(canemu, canemu->bitrate_bps);
}
#else
if(canemu->errors.all && (canemu->EmuFlag == 0))
{
CANEmu_Init(canemu, canemu->bitrate_bps);
}
else if ((canemu->errors.all == 0) && canemu->EmuFlag)
{
canemu->EmuFlag = 0;
HAL_CAN_MspInit(&hcan);
}
#endif
}
void CAN_SendFrame(CANEmu_HandleTypeDef *canemu)
{
#ifdef CAN_ONLY_EMULATING
CANEmu_SendFrame(canemu);
#else
if(canemu->errors.all)
CANEmu_SendFrame(canemu);
else
HAL_CAN_AddTxMessage(&hcan, &canemu->header, canemu->data, &mbox);
#endif
}
void CANEmu_Working(CANEmu_HandleTypeDef *canemu)
{
if(flag_manual == 0)
{
canemu->start_poll = MB_DATA.Coils.START_POLLING;
canemu->transmit = MB_DATA.Coils.START_SINGLE_FRAME;
canemu->period_ms = MB_DATA.HoldRegs.CAN_PERIOD;
if(canemu->period_ms < CAN_MIN_PERIOD)
{
canemu->period_ms = CAN_MIN_PERIOD;
}
// can message
canemu->header.IDE = MB_DATA.Coils.HEADER_IDE;
canemu->header.RTR = MB_DATA.Coils.HEADER_RTR;
canemu->bitrate_bps = (uint32_t)MB_DATA.HoldRegs.CAN_BITRATE_KBPS*1000;
canemu->header.ExtId = ((uint32_t)MB_DATA.HoldRegs.CAN_ID_HI << 16) | MB_DATA.HoldRegs.CAN_ID_LO;
canemu->header.StdId = canemu->header.ExtId;
canemu->header.DLC = (uint8_t)MB_DATA.HoldRegs.CAN_DLC & 0xF;
canemu->data[0] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_0;
canemu->data[1] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_1;
canemu->data[2] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_2;
canemu->data[3] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_3;
canemu->data[4] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_4;
canemu->data[5] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_5;
canemu->data[6] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_6;
canemu->data[7] = (uint8_t)MB_DATA.HoldRegs.CAN_DATA_7;
// errors
canemu->errors.bit.FF_SRS = MB_DATA.Coils.FLIP_SRS;
canemu->errors.bit.FF_IDE = MB_DATA.Coils.FLIP_IDE;
canemu->errors.bit.FF_RTR = MB_DATA.Coils.FLIP_RTR;
canemu->errors.bit.FF_R1 = MB_DATA.Coils.FLIP_R1;
canemu->errors.bit.FF_R0 = MB_DATA.Coils.FLIP_R0;
canemu->errors.bit.MSGID = MB_DATA.Coils.FLIP_MSGID_BIT;
canemu->errors.bit.DATA = MB_DATA.Coils.FLIP_DATA_BIT;
canemu->errors.bit.CRC_ERR = MB_DATA.Coils.FLIP_CRC_BIT;
canemu->errors.bit.STUFF_BITS = MB_DATA.Coils.DISABLE_STUFF_BITS;
}
CAN_Init(canemu);
if(canemu->start_poll)
{
canemu->transmit = 0;
HAL_Delay(canemu->period_ms);
CAN_SendFrame(canemu);
}
else if((canemu->transmit == 1) && (transmit_prev == 0))
{
CAN_SendFrame(canemu);
}
transmit_prev = canemu->transmit;
}

12
Core/CANEmu/canWorking.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef CANWORKING_H
#define CANWORKING_H
#include "stm32f1xx_hal.h"
#include "can.h"
#include "rs_message.h"
#include "canEmu.h"
void CANEmu_Working(CANEmu_HandleTypeDef *canemu);
#endif // CANEMU_H

View File

@ -161,7 +161,7 @@ void form_CAN_bitstream_full(const CAN_TxHeaderTypeDef *header, const uint8_t *d
uint32_t crc_start = raw_len; uint32_t crc_start = raw_len;
append_bits(raw_bits, &raw_len, crc, 15); append_bits(raw_bits, &raw_len, crc, 15);
if (errors.CRC_ERR) { if (errors.bit.CRC_ERR) {
flip_bit(crc_start); // инвертируем 1-й бит CRC для примера flip_bit(crc_start); // инвертируем 1-й бит CRC для примера
} }
@ -169,17 +169,17 @@ void form_CAN_bitstream_full(const CAN_TxHeaderTypeDef *header, const uint8_t *d
append_bit(raw_bits, &raw_len, 1); append_bit(raw_bits, &raw_len, 1);
// Ошибки // Ошибки
if (errors.FF_SRS) flip_bit(srr_idx); if (errors.bit.FF_SRS) flip_bit(srr_idx);
if (errors.FF_IDE) flip_bit(ide_idx); if (errors.bit.FF_IDE) flip_bit(ide_idx);
if (errors.FF_RTR) flip_bit(rtr_idx); if (errors.bit.FF_RTR) flip_bit(rtr_idx);
if (errors.FF_R1) flip_bit(r1_idx); if (errors.bit.FF_R1) flip_bit(r1_idx);
if (errors.FF_R0) flip_bit(r0_idx); if (errors.bit.FF_R0) flip_bit(r0_idx);
if (errors.DATA) flip_bit(data_idx); if (errors.bit.DATA) flip_bit(data_idx);
// MSGID_ERR — переворачиваем 1-й бит ID (MSB ID[10]) для примера // MSGID_ERR — переворачиваем 1-й бит ID (MSB ID[10]) для примера
if (errors.MSGID) flip_bit(id_start); if (errors.bit.MSGID) flip_bit(id_start);
// 10. Apply bit stuffing, пропускаем вставку stuff bits если ошибка ERR_STUFF_BITS // 10. Apply bit stuffing, пропускаем вставку stuff bits если ошибка ERR_STUFF_BITS
apply_bit_stuffing_with_error(raw_bits, raw_len, can_bits, &can_bits_len, errors.STUFF_BITS); apply_bit_stuffing_with_error(raw_bits, raw_len, can_bits, &can_bits_len, errors.bit.STUFF_BITS);
// 7. ACK Slot (dominant) // 7. ACK Slot (dominant)
append_bit(can_bits, &can_bits_len, 1); append_bit(can_bits, &can_bits_len, 1);

View File

@ -7,17 +7,21 @@
#include <stdbool.h> #include <stdbool.h>
typedef struct { typedef union {
uint16_t FF_SRS : 1; // Ошибка SRS бит (extended frame) uint16_t all;
uint16_t FF_IDE : 1; // Ошибка IDE бит struct
uint16_t FF_RTR : 1; // Ошибка RTR бит {
uint16_t FF_R1 : 1; // Ошибка r1 бит (reserved) unsigned FF_SRS : 1; // Ошибка SRS бит (extended frame)
uint16_t FF_R0 : 1; // Ошибка r0 бит (reserved) unsigned FF_IDE : 1; // Ошибка IDE бит
uint16_t MSGID : 1; // Ошибка битов ID unsigned FF_RTR : 1; // Ошибка RTR бит
uint16_t DATA : 1; // Ошибка битов данных unsigned FF_R1 : 1; // Ошибка r1 бит (reserved)
uint16_t CRC_ERR : 1; // Ошибка битов CRC unsigned FF_R0 : 1; // Ошибка r0 бит (reserved)
uint16_t STUFF_BITS : 1; // Ошибка бит-стаффинга (пропуск вставки stuff bits) unsigned MSGID : 1; // Ошибка битов ID
uint16_t reserved : 7; // Зарезервировано unsigned DATA : 1; // Ошибка битов данных
unsigned CRC_ERR : 1; // Ошибка битов CRC
unsigned STUFF_BITS : 1; // Ошибка бит-стаффинга (пропуск вставки stuff bits)
unsigned reserved : 7; // Зарезервировано
}bit;
} CAN_ErrorFlags_t; } CAN_ErrorFlags_t;
#ifndef IS_FUNCTIONAL_STATE #ifndef IS_FUNCTIONAL_STATE

View File

@ -70,6 +70,14 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// /*Configure GPIO pin : PA9 */
// GPIO_InitStruct.Pin = GPIO_PIN_9;
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
} }
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */

File diff suppressed because one or more lines are too long

View File

@ -148,56 +148,7 @@
<Name>-U37FF71064E57343625581443 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL010000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name> <Name>-U37FF71064E57343625581443 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL010000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name>
</SetRegEntry> </SetRegEntry>
</TargetDriverDllRegistry> </TargetDriverDllRegistry>
<Breakpoint> <Breakpoint/>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>97</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134238940</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/main.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\CANEmu\../Core/Src/main.c\97</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>193</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134235426</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/stm32f1xx_it.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\CANEmu\../Core/Src/stm32f1xx_it.c\193</Expression>
</Bp>
<Bp>
<Number>2</Number>
<Type>0</Type>
<LineNumber>194</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>../Core/Src/stm32f1xx_it.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
</Breakpoint>
<WatchWindow1> <WatchWindow1>
<Ww> <Ww>
<count>0</count> <count>0</count>
@ -277,6 +228,10 @@
<Name>System Viewer\GPIOA</Name> <Name>System Viewer\GPIOA</Name>
<WinId>35905</WinId> <WinId>35905</WinId>
</Entry> </Entry>
<Entry>
<Name>System Viewer\GPIOC</Name>
<WinId>35904</WinId>
</Entry>
</SystemViewers> </SystemViewers>
<DebugDescription> <DebugDescription>
<Enable>1</Enable> <Enable>1</Enable>
@ -645,6 +600,30 @@
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\Core\CANEmu\canWorking.c</PathWithFileName>
<FilenameWithoutPath>canWorking.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\CANEmu\canWorking.h</PathWithFileName>
<FilenameWithoutPath>canWorking.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\CANEmu\canEmu.c</PathWithFileName> <PathWithFileName>..\Core\CANEmu\canEmu.c</PathWithFileName>
<FilenameWithoutPath>canEmu.c</FilenameWithoutPath> <FilenameWithoutPath>canEmu.c</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@ -652,7 +631,7 @@
</File> </File>
<File> <File>
<GroupNumber>5</GroupNumber> <GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber> <FileNumber>30</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -664,7 +643,7 @@
</File> </File>
<File> <File>
<GroupNumber>5</GroupNumber> <GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber> <FileNumber>31</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -676,7 +655,7 @@
</File> </File>
<File> <File>
<GroupNumber>5</GroupNumber> <GroupNumber>5</GroupNumber>
<FileNumber>30</FileNumber> <FileNumber>32</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -686,6 +665,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\CANEmu\canConfig.h</PathWithFileName>
<FilenameWithoutPath>canConfig.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -696,7 +687,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>31</FileNumber> <FileNumber>34</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -708,7 +699,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>32</FileNumber> <FileNumber>35</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -720,7 +711,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>33</FileNumber> <FileNumber>36</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -732,7 +723,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber> <FileNumber>37</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -744,7 +735,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber> <FileNumber>38</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -756,7 +747,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber> <FileNumber>39</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -768,7 +759,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber> <FileNumber>40</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -780,7 +771,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>38</FileNumber> <FileNumber>41</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>

View File

@ -841,6 +841,16 @@
<Group> <Group>
<GroupName>CAN</GroupName> <GroupName>CAN</GroupName>
<Files> <Files>
<File>
<FileName>canWorking.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\CANEmu\canWorking.c</FilePath>
</File>
<File>
<FileName>canWorking.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\CANEmu\canWorking.h</FilePath>
</File>
<File> <File>
<FileName>canEmu.c</FileName> <FileName>canEmu.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -861,6 +871,11 @@
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>..\Core\CANEmu\canform.h</FilePath> <FilePath>..\Core\CANEmu\canform.h</FilePath>
</File> </File>
<File>
<FileName>canConfig.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\CANEmu\canConfig.h</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>