You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
3.8 KiB
C

#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;
}