在线时间14 小时
UID3535179
注册时间2019-2-26
NXP金币0
该用户从未签到
注册会员

- 积分
- 109
- 最后登录
- 2020-10-19
|
本人新手,刚接触S32K144这个芯片不久,CAN通信搞了二天,一直没调通。不知道是不是那儿有问题。
我按以下步骤写的代码:
1.CAN引脚及模块配置初始化;2,编写发送代码;3.在1S的定时中断里调用发送代码。
在电脑上用周立功USB转CAN模块监视,一直收不到数据。有没有好心人帮忙看看。具体代码如下:
1.初始化
PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK; //使能PTE端口时钟
PCC->PCCn[PCC_FlexCAN0_INDEX] |= PCC_PCCn_CGC_MASK;
PORTE->PCR[4] |= PORT_PCR_MUX(5);
PORTE->PCR[5] |= PORT_PCR_MUX(5);
//软件复位
can_ptr->MCR |= CAN_MCR_SOFTRST_MASK;
can_ptr->MCR &= ~CAN_MCR_SOFTRST_MASK;
can_ptr->MCR |= CAN_MCR_MDIS_MASK;
//设置时钟源 选择SOS时钟源 8MHz
can_ptr->CTRL1 &= ~CAN_CTRL1_CLKSRC_MASK;
//使能模块
can_ptr->MCR &= ~CAN_MCR_MDIS_MASK;
//等待进入冻结模式
while (!((can_ptr->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT)){}
while( (can_ptr->MCR & CAN_MCR_LPMACK_MASK) != 0){} /* Wait until FlexCAN module is out of low power mode */
CAN0->MCR &= ~CAN_MCR_IRMQ_MASK; /* 1: Individual Rx Masking and Queue Ennable */
CAN0->MCR |= CAN_MCR_AEN_MASK|CAN_MCR_SRXDIS_MASK; /* AEN=1: Abort enabled ,Disable self reception */
//配置控制寄存器1 RJW=0B11; PSG1=0B011; PSG2=0X011; PROPSEG=0B110;
can_ptr->CTRL1 = 0x00DB0006;
//清空数据
if(FlexCAN_No == CAN_0)
{
for(i = 0 ; i < 128; i++)
{
can_ptr->RAMn = 0x0;
}
}
else
{
for(i = 0 ; i < 64; i++)
{
can_ptr->RAMn = 0x0;
}
}
//配置接收掩码寄存器
for(i = 0; i < CAN_RXIMR_COUNT; i++)
{
can_ptr->RXIMR = 0xFFFFFFFF;
}
//接收信箱全局掩码寄存器
can_ptr->RXMGMASK = 0x1FFFFFFF;
//配置接收信箱大小
can_ptr->MCR = CAN_MCR_MAXMB(7);
//等待冻结模式结束
while ((can_ptr->MCR && CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT);
//等待准备完成
while ((can_ptr->MCR && CAN_MCR_NOTRDY_MASK) >> CAN_MCR_NOTRDY_SHIFT);
2,编写发送代码
void FlexCan_send_8Byte(uint8 FlexCAN_No,uint8 data[],uint8 num,uint32 adress,uint8 adressMode)
{
//局部变量声明
uint8 j,i;
uint8 tem[8]={0};
CAN_MemMapPtr can_ptr = CAN_PTR[FlexCAN_No];
i = 0;
for(j = 0; j < num; j++)
{
tem[j] = data[j];
}
//清标志寄存器
can_ptr->IFLAG1 |= 0xffffffff;
//等待CAN总线空闲
while(BGET(CAN_ESR1_IDLE_SHIFT,can_ptr->ESR1) == 0);
//存放数据到数据区
for (j = 0; j < num;j += 4,i++)
{
can_ptr->RAMn[0*MSG_BUF_SIZE + 2 +i] = (tem[j] << 24 | tem[j + 1] << 16 | \
tem[j + 2] << 8 | tem[j + 3]);
}
if (adressMode == 1)//使用拓展地址模式,地址为29位模式
{
//配置发送的ID
can_ptr->RAMn[0*MSG_BUF_SIZE + 1] = adress;
//配置帧的CODE = 1100 SRR =1 IDE =1 DLC= 15
can_ptr->RAMn[0*MSG_BUF_SIZE + 0] = 0x0C600000 | 8 <<CAN_WMBn_CS_DLC_SHIFT;
}
else //使用非拓展地址模式,地址长度为11位
{
//配置发送的ID
can_ptr->RAMn[0*MSG_BUF_SIZE + 1] = adress << 18;
//配置帧的CODE = 1100; SRR =1 DLC = 15
can_ptr->RAMn[0*MSG_BUF_SIZE + 0] = 0x0C400000 | 8 <<CAN_WMBn_CS_DLC_SHIFT;
}
}
3.定时中断里调用发送数据函数
void SysTick_Handler(void)
{
static uint8 SysTickcount = 0;
SysTickcount++;
if(SysTickcount >= 100) //1s到
{
SysTickcount = 0;
LEDflag ^=1;
FlexCan_send_8Byte(CAN_0,CANTestBuf,8,0x555,EXTEND_ID);
}
}
4.在main 里调用初始化
FlexCan_init(CAN_0,FLEXCAN_CLASSIC);//初始化CAN0
ENABLE_INTERRUPTS;//开总中断
FlexCan_re_enable_int(0);
最佳答案
woily1981 发表于 2019-6-3 14:59
我用的是NXP的EVB板,用的MiniUSB口供的电,应该不用再给其他电源了吧。
单独供电的收发器芯片 12V 你可以看看芯片的数据手册 ...
|
|