S9KEAZ128 CAN 发送和接收过滤示例程序
#include "SKEAZ1284.h"
#define CAN0_BASE_PTR SKEAZN1284 #define CAN1_BASE_PTR SKEAZN1284
void CAN0_Init(void) { // Enable clock for CAN0 module SIM_SCGC |= SIM_SCGC_CAN0_MASK;
// Configure pins for CAN0
// Set pins to alternative function mode
PORTA_PCR12 |= PORT_PCR_MUX(2); // CAN0_TX
PORTA_PCR13 |= PORT_PCR_MUX(2); // CAN0_RX
// Configure CAN0 module
CAN0_MCR |= CAN_MCR_FRZ_MASK; // Enter freeze mode
CAN0_MCR &= ~CAN_MCR_MDIS_MASK; // Enable module
CAN0_MCR |= CAN_MCR_IRMQ_MASK; // Individual Rx masking
CAN0_MCR |= CAN_MCR_AEN_MASK; // Enable Rx ID acceptance filter
CAN0_CTRL1 |= CAN_CTRL1_CLKSRC_MASK | CAN_CTRL1_CANEN_MASK; // Use oscillator clock
// Set bit rate for CAN0
CAN0_CTRL1 |= CAN_CTRL1_PROPSEG(2) | CAN_CTRL1_PSEG1(1) |
CAN_CTRL1_PSEG2(1) | CAN_CTRL1_PRESDIV(4);
// Enable interrupts for CAN0
CAN0_IMASK1 |= CAN_IMASK1_BUF0M_MASK; // Enable buffer 0 interrupt
NVICICPR0 |= (1 << 19); // Clear pending interrupts
NVICISER0 |= (1 << 19); // Enable interrupts
}
void CAN0_FilterInit(void) { // Configure filter 0 for standard ID CAN0_RXIMR0 |= CAN_RXIMR0_MI(0); // Enable filter 0 CAN0_RXMGMASK |= CAN_RXMGMASK_MG(0); // Match filter 0
// Configure filter 1 for extended ID
CAN0_RXIMR1 |= CAN_RXIMR1_MI(1); // Enable filter 1
CAN0_RXMGMASK |= CAN_RXMGMASK_MG(1); // Match filter 1
// Set ID for filter 0 and filter 1
CAN0_RXFGMASK = 0xFF; // Match all bits
CAN0_IDFLT_TAB[0] = 0x123; // Set filter 0 ID
CAN0_IDFLT_TAB[1] = 0x456; // Set filter 1 ID
}
void CAN0_Send(uint32_t id, uint8_t *data, uint8_t length) { // Wait for transmit buffer 0 to be empty while (!(CAN0_IFLAG1 & CAN_IFLAG1_BUF0I_MASK));
// Set ID and length
CAN0_IFLAG1 |= CAN_IFLAG1_BUF0I_MASK; // Clear interrupt flag
CAN0_MBn_ID(0) = id; // Set ID
CAN0_MBn_CS(0) = CAN_CS_CODE(CAN_TX_IN_PROGRESS) | CAN_CS_LENGTH(length); // Set length
// Set data
for (uint8_t i = 0; i < length; i++) {
CAN0_MBn_DATA_BYTE(0, i) = data[i];
}
// Start transmission
CAN0_MBn_CS(0) |= CAN_CS_CODE(CAN_TX_TRANSMIT);
}
void CAN0_Receive(void) { // Check if buffer 4 has received a message if (CAN0_IFLAG1 & CAN_IFLAG1_BUF4I_MASK) { // Read ID and length uint32_t id = CAN0_MBn_ID(4); uint8_t length = CAN0_MBn_CS(4) & CAN_CS_LENGTH_MASK;
// Read data
uint8_t data[8];
for (uint8_t i = 0; i < length; i++) {
data[i] = CAN0_MBn_DATA_BYTE(4, i);
}
// Process received message
// Clear interrupt flag
CAN0_IFLAG1 |= CAN_IFLAG1_BUF4I_MASK;
}
}
void CAN0_IRQHandler(void) { CAN0_Receive(); }
int main(void) { // Initialize CAN0 module CAN0_Init();
// Initialize CAN0 filters
CAN0_FilterInit();
// Enable interrupts
__enable_irq();
while (1) {
// Send a CAN message
uint8_t data[] = {0x01, 0x02, 0x03};
CAN0_Send(0x123, data, sizeof(data));
// Delay
for (volatile uint32_t i = 0; i < 1000000; i++);
}
}
原文地址: https://www.cveoy.top/t/topic/p1bo 著作权归作者所有。请勿转载和采集!