|
|
|
|
#include "SWM221.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SWM221 <==CAN_RX/TX==> CAN <20>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TJA1050<35><30><==CAN_H/L==> CAN <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
|
|
|
|
|
* 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CAN <EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CAN <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǶϿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ACK <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CAN->TXERR <EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 128<EFBFBD><EFBFBD>Ȼ<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SWM221 <EFBFBD><EFBFBD> CAN <EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CAN->TXERR <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 255<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Bus Off<EFBFBD><EFBFBD>CAN->CR.RST <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD> 1<EFBFBD><EFBFBD>CAN ģ<EFBFBD>鴦<EFBFBD>ڸ<EFBFBD>λ״̬
|
|
|
|
|
* 3<EFBFBD><EFBFBD>ISR <EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD> Bus Off <EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD> CAN_Open(CAN0) ʹ CAN ģ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD>λ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻָ<EFBFBD><EFBFBD><EFBFBD>CAN->TXERR <EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>CAN ģ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SerialInit(void);
|
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
|
{
|
|
|
|
|
CAN_InitStructure CAN_initStruct;
|
|
|
|
|
|
|
|
|
|
SystemInit();
|
|
|
|
|
|
|
|
|
|
SerialInit();
|
|
|
|
|
|
|
|
|
|
PORT_Init(PORTC, PIN2, PORTC_PIN2_CAN0_RX, 1);
|
|
|
|
|
PORT_Init(PORTC, PIN3, PORTC_PIN3_CAN0_TX, 0);
|
|
|
|
|
|
|
|
|
|
CAN_initStruct.Mode = CAN_MODE_NORMAL;
|
|
|
|
|
CAN_initStruct.CAN_bs1 = CAN_BS1_5tq;
|
|
|
|
|
CAN_initStruct.CAN_bs2 = CAN_BS2_4tq;
|
|
|
|
|
CAN_initStruct.CAN_sjw = CAN_SJW_2tq;
|
|
|
|
|
CAN_initStruct.Baudrate = 50000;
|
|
|
|
|
CAN_initStruct.RXNotEmptyIEn = 1;
|
|
|
|
|
CAN_initStruct.ArbitrLostIEn = 0;
|
|
|
|
|
CAN_initStruct.ErrPassiveIEn = 1;
|
|
|
|
|
CAN_Init(CAN0, &CAN_initStruct);
|
|
|
|
|
|
|
|
|
|
CAN_INTEn(CAN0, CAN_IT_ERR_WARN | CAN_IT_RX_OVERFLOW);
|
|
|
|
|
|
|
|
|
|
CAN_SetFilter32b(CAN0, CAN_FILTER_1, 0x00122122, 0x1FFFFFFE); //<2F><><EFBFBD><EFBFBD>IDΪ0x00122122<32><32>0x00122123<32><33><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>
|
|
|
|
|
CAN_SetFilter16b(CAN0, CAN_FILTER_2, 0x122, 0x7FE, 0x101, 0x7FF); //<2F><><EFBFBD><EFBFBD>IDΪ0x122<32><32>123<32><33>0x101<30>ı<EFBFBD><EFBFBD><D7BC>
|
|
|
|
|
|
|
|
|
|
CAN_Open(CAN0);
|
|
|
|
|
|
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
|
uint8_t tx_data[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
|
|
|
|
|
|
|
|
CAN_Transmit(CAN0, CAN_FRAME_STD, 0x133, tx_data, 8, 1);
|
|
|
|
|
while(CAN_TXComplete(CAN0) == 0) __NOP();
|
|
|
|
|
|
|
|
|
|
printf("\r\nCAN->TXERR: %d\r\n", CAN0->TXERR);
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < SystemCoreClock / 16; i++) __NOP();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CAN0_Handler(void)
|
|
|
|
|
{
|
|
|
|
|
uint32_t can_if = CAN_INTStat(CAN0);
|
|
|
|
|
|
|
|
|
|
if(can_if & CAN_IF_RXDA_Msk)
|
|
|
|
|
{
|
|
|
|
|
CAN_RXMessage msg;
|
|
|
|
|
|
|
|
|
|
CAN_Receive(CAN0, &msg);
|
|
|
|
|
|
|
|
|
|
if(msg.size > 0)
|
|
|
|
|
{
|
|
|
|
|
printf("\r\nReceive %s: %08X, ", msg.format == CAN_FRAME_STD ? "STD" : "EXT", msg.id);
|
|
|
|
|
for(int i = 0; i < msg.size; i++) printf("%02X, ", msg.data[i]);
|
|
|
|
|
printf("\r\n");
|
|
|
|
|
}
|
|
|
|
|
else if(msg.remote == 1) //Զ<><D4B6>֡
|
|
|
|
|
{
|
|
|
|
|
printf("\r\nReceive %s Remote Request\r\n", msg.format == CAN_FRAME_STD ? "STD" : "EXT");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(can_if & CAN_IF_RXOV_Msk)
|
|
|
|
|
{
|
|
|
|
|
printf("\r\nCAN RX Overflow\r\n");
|
|
|
|
|
|
|
|
|
|
CAN_Close(CAN0);
|
|
|
|
|
for(int i = 0; i < CyclesPerUs; i++) __NOP();
|
|
|
|
|
CAN_Open(CAN0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(can_if & CAN_IF_ERRWARN_Msk)
|
|
|
|
|
{
|
|
|
|
|
if(CAN0->SR & CAN_SR_BUSOFF_Msk)
|
|
|
|
|
{
|
|
|
|
|
printf("\r\nCAN Bus Off\r\n");
|
|
|
|
|
printf("\r\nCAN->CR.RST = %d\r\n", CAN0->CR & CAN_CR_RST_Msk ? 1 : 0);
|
|
|
|
|
|
|
|
|
|
CAN_Open(CAN0); //Bus Off recovery
|
|
|
|
|
}
|
|
|
|
|
else if(CAN0->SR & CAN_SR_ERRWARN_Msk)
|
|
|
|
|
{
|
|
|
|
|
printf("\r\nCAN Error Warning\r\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(can_if & CAN_IF_ERRPASS_Msk)
|
|
|
|
|
{
|
|
|
|
|
printf("\r\nCAN Error Passive\r\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SerialInit(void)
|
|
|
|
|
{
|
|
|
|
|
UART_InitStructure UART_initStruct;
|
|
|
|
|
|
|
|
|
|
PORT_Init(PORTA, PIN0, PORTA_PIN0_UART0_RX, 1); //GPIOA.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪUART0 RXD
|
|
|
|
|
PORT_Init(PORTA, PIN1, PORTA_PIN1_UART0_TX, 0); //GPIOA.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪUART0 TXD
|
|
|
|
|
|
|
|
|
|
UART_initStruct.Baudrate = 57600;
|
|
|
|
|
UART_initStruct.DataBits = UART_DATA_8BIT;
|
|
|
|
|
UART_initStruct.Parity = UART_PARITY_NONE;
|
|
|
|
|
UART_initStruct.StopBits = UART_STOP_1BIT;
|
|
|
|
|
UART_initStruct.RXThreshold = 3;
|
|
|
|
|
UART_initStruct.RXThresholdIEn = 0;
|
|
|
|
|
UART_initStruct.TXThreshold = 3;
|
|
|
|
|
UART_initStruct.TXThresholdIEn = 0;
|
|
|
|
|
UART_initStruct.TimeoutTime = 10;
|
|
|
|
|
UART_initStruct.TimeoutIEn = 0;
|
|
|
|
|
UART_Init(UART0, &UART_initStruct);
|
|
|
|
|
UART_Open(UART0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: fputc()
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: printf()ʹ<EFBFBD>ô˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵĴ<EFBFBD><EFBFBD>ڴ<EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: int ch Ҫ<EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
|
|
|
|
* FILE *f <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
******************************************************************************************************************************************/
|
|
|
|
|
int fputc(int ch, FILE *f)
|
|
|
|
|
{
|
|
|
|
|
UART_WriteByte(UART0, ch);
|
|
|
|
|
|
|
|
|
|
while(UART_IsTXBusy(UART0));
|
|
|
|
|
|
|
|
|
|
return ch;
|
|
|
|
|
}
|