How to transmit more than 8bytes data via basic CAN Bus
Hi all!
I have a problem with transmition/receiving more than 8 bytes of data between two STM32 MCUs via CAN-Network.
I know, it is impossible to transmit more than 8 bytes of data via basic CAN Bus.
I tried to create Command messages System.
CAN Master transmit to CAN Slave command message "RT" (aka "Read Temperatures") and CAN Slave reply 'T' and 7 bytes of data with Temperature values. At that level it is all fine. CAN Master transmitting and then receiving the values.
Then CAN Master transmits next command message"RP" (aka "Read Pressures") and CAN Slave reply 'P' and 7 bytes of data with Pressure Values. CAN Master, continuously transmitting each command after receiving values from previous command.
At that point starts the problem.
The values are overlapping with each other.
I have a question, is anybody had experience with transmitting/receiving more than 8 bytes of data via basic CAN Bus? Is there some special technic for this?
Thanks in advance.
Below part of my code.
CAN Master:
uint8_t TxData[8];
uint8_t RxData[8];
uint32_t TxMailbox;
uint8_t datacheck=0;
int Td=0; //****Discharge Temperature*************************
int Ts=0; //****Suction Temperature***************************
int Tc2=0; //****Condenser Outlet Temperature******************
int Tih=0; //****IHX Outlet Temperature************************
int Te1=0; //****Evaporator Inlet Temperature******************
int Tev=0; //****Evaporator Temperature************************
int16_t T_MCU; //****Temperature of Slave Microcontroller
int8_t Temp=0; //****Temperature of Slave Microcontroller
uint16_t Ps_R=0; //****Pressure Readings from Slave Microcontroller's ADC
uint16_t Pd_R=0; //****Pressure Readings from Slave Microcontroller's ADC
float Pd=0.0;
float Psuct=0.0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ETH_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_USB_OTG_FS_PCD_Init(void);
static void MX_CAN1_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;
void CAN_Bus_Start_Init(void)
{
TxData[0]='R';
TxData[1]='T';
HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData);
if(RxHeader.StdId==0x103)
{
switch(RxData[0])
{
case 'T':
datacheck=1;
break;
case 'P':
datacheck=2;
break;
}
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ETH_Init();
MX_USART3_UART_Init();
MX_USB_OTG_FS_PCD_Init();
MX_CAN1_Init();
/* USER CODE BEGIN 2 */
HAL_CAN_Start(&hcan1);
//***Activate the Notification**********
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
TxHeader.DLC=8; //data length
TxHeader.IDE=CAN_ID_STD;
TxHeader.RTR=CAN_RTR_DATA;
TxHeader.StdId=0x767; //ID
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
ILI9486_Initialization();
Clear_Screen(0x0000);
tft_string(10,10,0xFFFF, 0x0000,12,"Discharge Temperature:");
tft_string(10,30,0xFFFF, 0x0000,12,"Suction Temperature:");
tft_string(10,50,0xFFFF, 0x0000,12,"Condenser Outlet Temperature:");
tft_string(10,70,0xFFFF, 0x0000,12,"IHX Outlet Temperature:");
tft_string(10,90,0xFFFF, 0x0000,12,"Evaporator Inlet Temperature:");
tft_string(10,110,0xFFFF, 0x0000,12,"Evaporator Temperature:");
tft_string(10,130,0xFFFF, 0x0000,12,"MCU's Temperature:");
Write_Command(0x29); // Display ON
CAN_Bus_Start_Init();
while (1)
{//********Defining_Parameters_from_Slave_MCU*************************************
switch(datacheck)
{
case 1:
Td=RxData[1];
Ts=RxData[2];
Tc2=RxData[3];
Tih=RxData[4];
Te1=RxData[5];
Tev=RxData[6];
TxData[0]='R';
TxData[1]='P';
break;
case 2:
T_MCU=(RxData[2]<<8|RxData[1]);
Ps_R=(RxData[4]<<8|RxData[3]);
Pd_R=(RxData[6]<<8|RxData[5]);
Temp=(int8_t)(((V25-(3.3*T_MCU/4095))/Avg_Slope)+25);
Psuct=(float)(3.3*Ps_R/4095); //Voltage from Suction Pressure Sensor
Psuct=(Psuct-0.26)/0.2; //For Danfoss Pressure Ratiometric Transmitter NSK-BE10I-U169 with 3.3V Supply
Pd=(float)(3.3*Pd_R/4095); //Voltage from Discharge Pressure Sensor
Pd=(Pd-0.27)*15.38; //For Danfoss Pressure Ratiometric Transmitter NSK-BE30I-U169 with 3.3V Supply
TxData[0]='R';
TxData[1]='T';
break;
}
datacheck=0;
tft_integer(140,10,0x07FF, 0x0000,12,Td, 5);
tft_integer(140,30,0x07FF, 0x0000,12,Ts, 5);
tft_integer(200,50,0x07FF, 0x0000,12,Tc2, 5);
tft_integer(200,70,0x07FF, 0x0000,12,Tih, 5);
tft_integer(200,90,0x07FF, 0x0000,12,Te1, 5);
tft_integer(200,110,0x07FF, 0x0000,12,Tev, 5);
tft_integer(200,130,0x07FF, 0x0000,12,Temp, 5);
tft_float(200,10,0xF800, 0x0000,12,Pd, 6);
tft_float(200,30,0xF800, 0x0000,12,Psuct, 6);
HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}