Das ist unterschiedlich.
Maximal verschicke ich 8 Bytes, dies aber eher sehr selten.
Hier ist mal mein "CAN Parser"
CodeBox C
uint8_t can_parser(CAN_messageType msg)
{
switch(recMsg.id)
{
case CPU_CTRL_ID:
{
switch (recMsg.data[0])
{
case HEARTBEAT_ON:
{
HEARTBEAT_LED_ON;
send_str_can(CPU_CTRL_ID + HEARTBEAT_ON, "ok");
}break;
case HEARTBEAT_OFF:
{
HEARTBEAT_LED_OFF;
send_str_can(CPU_CTRL_ID + HEARTBEAT_OFF, "ok");
}break;
case HEARTBEAT_TOGGLE:
{
HEARTBEAT_LED_TOGGLE;
send_str_can(CPU_CTRL_ID + HEARTBEAT_TOGGLE, "ok");
}break;
case TRANSMIT_ID:
{
send_str_can(CPU_CTRL_ID+TRANSMIT_HW_VERSION, hardware_id);
}break;
case TRANSMIT_SW_VERSION:
{
send_str_can(CPU_CTRL_ID+TRANSMIT_SW_VERSION, software_version);
}break;
case TRANSMIT_HW_VERSION:
{
send_str_can(CPU_CTRL_ID+TRANSMIT_SW_VERSION, hardware_version);
}break;
case WRITE_TIME:
{
RX8564_set_Time(recMsg.data[1],recMsg.data[2],recMsg.data[3]);
send_str_can(CPU_CTRL_ID + WRITE_TIME, "ok");
}break;
case WRITE_DATE:
{
RX8564_set_Date(recMsg.data[1],recMsg.data[2],recMsg.data[3],recMsg.data[4]);
send_str_can(CPU_CTRL_ID + WRITE_DATE, "ok");
}break;
case TRANSMIT_TIME:
{
RX8564_get_Data();
send_bytes_can(TIME_ID,0x03,rx8564.hours,rx8564.minutes,rx8564.secounds,0x00,0x00,0x00,0x00,0x00);
}break;
case TRANSMIT_DATE:
{
RX8564_get_Data();
send_bytes_can(DATE_ID,0x04,rx8564.day,rx8564.day_name,rx8564.month,rx8564.year,0x00,0x00,0x00,0x00);
}break;
case I2C_ACCESS:
{
switch(recMsg.data[1])
{
case I2C_INIT :
{
i2c_init();
send_str_can(CPU_CTRL_ID + I2C_INIT, "ok");
}break;
case I2C_START_WRITE :
{
i2c_start_wait(recMsg.data[2]); // slave address
i2c_write(recMsg.data[3]); // register address
i2c_write(recMsg.data[4]); // register value
i2c_stop();
send_str_can(CPU_CTRL_ID + I2C_START_WRITE, "ok");
}break;
case I2C_START_READ :
{
i2c_start_wait(recMsg.data[2]+I2C_WRITE); // slave address
i2c_write(recMsg.data[3]); // register address
i2c_rep_start(recMsg.data[2]+I2C_READ);
send_u8_can(CPU_CTRL_ID,i2c_readNak());
i2c_stop();
}break;
case I2C_START_READ_x_BYTE :
{
char Buffer[recMsg.data[4]];
uint8_t cnt = 0;
i2c_start_wait(recMsg.data[2]+I2C_WRITE); // slave address
i2c_write(recMsg.data[3]); // register address
i2c_rep_start(recMsg.data[2]+I2C_READ);
for (cnt = 0 ; cnt < recMsg.data[4]; cnt++)
{
Buffer[cnt] = i2c_readAck();
}
Buffer[cnt] = i2c_readNak();
Buffer[cnt++] = '\0'; // end of string
i2c_stop();
send_str_can(CPU_CTRL_ID + I2C_ACCESS, Buffer);
}break;
}
}break;
case SPI_ACCESS:
{
switch(recMsg.data[1])
{
case SPI_MASTER_INIT:
{
spi_master_init(recMsg.data[2],recMsg.data[3]);
}break;
case SPI_MASTER_WRITE:
{
spi_disable_chip();
spi_enable_chip();
spi_master_transmit(recMsg.data[2]); // address
spi_master_transmit(recMsg.data[3]); // data byte
send_u8_can(CPU_CTRL_ID + SPI_ACCESS, spi_receive());
spi_disable_chip();
}break;
case SPI_MASTER_RECEIVE:
{
char Buffer[8];
uint8_t cnt = 0;
spi_disable_chip();
spi_enable_chip();
spi_master_transmit(recMsg.data[2]);
for (cnt = 0 ; cnt < recMsg.data[3] ; cnt++)
{
spi_master_transmit(0x00); // dummy byte
Buffer[cnt] = spi_receive(); // store received bytes
}
Buffer[cnt] = '\0'; // end of string
spi_disable_chip();
send_str_can(CPU_CTRL_ID + SPI_ACCESS, Buffer);
}break;
}
}break;
}
}break; // end switch(CPU_CTRL_ID)
case CPU_CALIBRATION_MODE:
{
if (recMsg.data[0] == WRITE_CALIBRATION_DATE) // write calibration date
{
eeprom_update_byte(&calibration_day, recMsg.data[1]); // day
eeprom_update_byte(&calibration_month, recMsg.data[2]); // month
eeprom_update_byte(&calibration_year, recMsg.data[3]); // year
}
if (recMsg.data[0] == TRANSMIT_CALIBRATION_DATE) // transmit calibration date
{
send_bytes_can(CPU_CALIBRATION_MODE + TRANSMIT_CALIBRATION_DATE,3, eeprom_read_byte(&calibration_day),eeprom_read_byte(&calibration_month),eeprom_read_byte(&calibration_year),0x00,0x00,0x00,0x00,0x00);
}
}break;
}// end switch (recMsg.id)
/* clear receive buffer */
for (uint8_t x = 0 ; x < recMsg.length ; x++)
{
recMsg.data[x] = 0;
recMsg.id = 0;
recMsg.length = 0;
recMsg.msk = 0;
}// end for
return 0;
}// end can_parser
Gerade was "Heartbeat" angeht. Diese werden meistens nicht wirklich Zyklisch "ein" bzw "aus" geschaltet, wenn ich den entsprechenden Befehl dafür schicke.
Mein Controller läuft mit vollen 16MHz..
Was für Infos brauchst du denn noch?