在线时间7 小时
UID1275361
注册时间2016-3-13
NXP金币0
该用户从未签到
新手上路

- 积分
- 48
- 最后登录
- 2021-5-10
|
本帖最后由 conan_zlc 于 2016-5-4 22:04 编辑
(1)使用例程代码修改为外部时钟输入外部晶振16MHz,配置总线时钟20Mhz,设置对应的BRP,TSEG1,TSEG2到波特率250K能够实现发送。 (2)使用自己编写的程序时,LOOPB=1时能够正常进入接收中断,收到数据正常。但配置成对外输出时,MSCANTFLG_TXEx清零启动发送后始终无法完成发送(即TXEx不置1),在主程序中查看MSCAN_CANRFLG值在0x08和0x3c跳变。下附源程序如下:
// Bit Rate = fCANCLK/{(1+TimeSegment1+TimeSegment2)*(Prescale value)}
// fCANCLK = OSC_Frequency = 16000000Mhz
// (1+TimeSegment1+TimeSegment2)*(Prescale value) = 64
// BRP = 4, TSEG1 = 11, TSEG2 = 4
#define SJW 1
#define BRP 4
#define TSEG1 11
#define TSEG2 4
void MSCAN_Init(void){
uint8_t tmp;
SIM_PINSEL1 |= SIM_PINSEL1_MSCANPS_MASK;
SIM->SCGC |= SIM_SCGC_MSCAN_MASK;
MSCAN_CANCTL1 |= MSCAN_CANCTL1_CANE_MASK;
MSCAN_CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK;
while((MSCAN_CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 0) {;} //wait INITRQ ==1
MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_CLKSRC_MASK;
MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_LISTEN_MASK;
MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_LOOPB_MASK;
//MSCAN_CANCTL1 |= MSCAN_CANCTL1_LOOPB_MASK;
//MSCAN_CANCTL0 |= MSCAN_CANCTL0_TIME_MASK;
// Bit Rate = fCANCLK/{(1+TimeSegment1+TimeSegment2)*(Prescale value)}
tmp = SJW - 1;
tmp = tmp << 6;
tmp |= (BRP - 1);
MSCAN_CANBTR0 = tmp; //Bit
tmp = TSEG2 - 1;
tmp = tmp << 4;
tmp |= (TSEG1 - 1);
MSCAN_CANBTR1 = tmp;
MSCAN_CANIDAR0 = 0x00; // 16 bit Filter 0
MSCAN_CANIDMR0 = 0xFF;
MSCAN_CANIDAR1 = 0x00;
MSCAN_CANIDMR1 = 0xFF;
MSCAN_CANIDAR2 = 0x00; // 16 bit Filter 1
MSCAN_CANIDMR2 = 0xFF;
MSCAN_CANIDAR3 = 0x00;
MSCAN_CANIDMR3 = 0xFF;
MSCAN_CANIDAR4 = 0x00; // 16 bit Filter 2
MSCAN_CANIDMR4 = 0xFF;
MSCAN_CANIDAR5 = 0x00;
MSCAN_CANIDMR5 = 0xFF;
MSCAN_CANIDAR6 = 0x00; // 16 bit Filter 3
MSCAN_CANIDMR6 = 0xFF;
MSCAN_CANIDAR7 = 0x00;
MSCAN_CANIDMR7 = 0xFF;
MSCAN_CANIDAC |= MSCAN_CANIDAC_IDAM_MASK;
MSCAN_CANCTL0 &= 0xFE; // Exit initialization mode request
while((MSCAN_CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 0x1) // Wait for normal mode
{
;
}
while((MSCAN_CANCTL0 & MSCAN_CANCTL0_SYNCH_MASK) == 0) // Wait for CAN synchronization
{
;
}
MSCAN_CANRFLG |= MSCAN_CANRFLG_RXF_MASK; // Clear receiver flags
MSCAN_CANRIER |= MSCAN_CANRIER_RXFIE_MASK; // Enable Full Receive Buffer
NVIC_EnableIRQ(MSCAN_RX_IRQn);
MSCAN_CANCTL1 |= MSCAN_CANCTL1_CANE_MASK;
}
//发送函数如下:
uint8_t MSCAN_SendFrame_Std(uint32_t id, uint8_t priority, uint8_t length, uint8_t *pData)
{
uint8_t i = 0;
uint16_t j = 0;
uint8_t txbuffer = 0;
watch1 = MSCAN_CANTFLG;
if((MSCAN_CANTFLG&0x07) == 0x00)
{
return ERR_TXBUF_FULL;
}
MSCAN_CANTBSEL = MSCAN_CANTFLG;
txbuffer = MSCAN_CANTBSEL;
MSCAN_TSIDR0 = (uint8_t)((id>>3)&0x00FF); //ID[10:3]
MSCAN_TSIDR1 = (uint8_t)((id<<5)&0x00E0); //ID[2:0] + RTR(=0) + IDE(=0)
for(i=0; i<length; i++) //Load data to Tx buffer Data Segment Registers
{
*(&MSCAN_TEDSR0 + i) = pData;
}
MSCAN_TDLR = length; //Set Data Length
MSCAN_TBPR = priority; //Set Priority
MSCAN_CANTFLG = txbuffer; //Write "1" to Clear the TXEx Flag bit and Start correspond TXx transmission
while((j<10000) && ((MSCAN_CANTFLG & txbuffer) != txbuffer)) //Wait for Transmission completion
{
j++;
}
watch2 = MSCAN_CANTFLG;
if(j >= 10000)
{
return ERR_TIMEOUT;
}
return ERR_NONE;
}
|
|