楼主: suoyuedudu

[已解决] LPC54616板子晶振波形杂乱,频率不对

[复制链接]

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 09:43:57 | 显示全部楼层
pythonworld 发表于 2018-12-12 16:56
能确定程序没有问题吗?既然能下载程序,说明硬件没有大问题。

程序就改动了一个LED的IO口,其他的都没动,下载进去就是没反应  LED灯也不亮
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 09:44:47 | 显示全部楼层
噬猎者 发表于 2018-12-12 21:16
土豪啊,用这么贵的芯片

额  公司买的   心不疼
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 09:52:54 | 显示全部楼层
小恩GG 发表于 2018-12-13 16:32
你说代码能下进去,你debug看下,代码跑死在哪里了?
你代码直接用内部晶振生成主频,然后再反转IO,看看灯 ...

代码直接内部晶振生成主频,这一步要怎做啊   我的代码能力有点弱 也是刚刚接触。我用的是下载的固件库包里面的例程  ,还有一个CAN-FD的套件例程包,我在用里面的 fd callbacks  这个文件夹里面的例程。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 09:57:33 | 显示全部楼层
小恩GG 发表于 2018-12-13 16:32
你说代码能下进去,你debug看下,代码跑死在哪里了?
你代码直接用内部晶振生成主频,然后再反转IO,看看灯 ...

我试了试你说的进去debug,好像是卡在了一个地方  ,每次暂停后都卡在那儿。1.这是我的时钟配置,不懂你说的内部晶振如何生成主频:
1.jpg

2.这个是LED操作
2.jpg
3.这是debug后卡的地方
3.jpg

4.这是我的代码
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "can.h"


#include "pin_mux.h"
#include <stdbool.h>
/*******************************************************************************
* Definitions
******************************************************************************/


#define APP_BOARD_TEST_GPIO_PORT1 BOARD_LED3_GPIO_PORT   //CAN0-LED  P0-8
#define APP_BOARD_TEST_GPIO_PORT2 BOARD_LED1_GPIO_PORT   //CAN1-LED  P0-9
#define APP_BOARD_TEST_GPIO_PORT3 BOARD_LED2_GPIO_PORT   //USB-LED   P1-14
#define APP_BOARD_TEST_LED1_PIN BOARD_LED3_GPIO_PIN
#define APP_BOARD_TEST_LED2_PIN BOARD_LED1_GPIO_PIN
#define APP_BOARD_TEST_LED3_PIN BOARD_LED2_GPIO_PIN


/*******************************************************************************
* Variables
******************************************************************************/


#define TICKRATE_HZ (1000)                  /* 每秒1000次 */
#define TRANSMIT_PERIOD (100)         /* 毫秒之间传输 */


/* handle for non-blocking send/receive on CAN0 */
static can_handle_t s_handle0;
/* handle for non-blocking send/receive on CAN1 */
static can_handle_t s_handle1;
/* handle for non-blocking receive for message buffer 0 */
static can_mb_transfer_t mb0rxfer;


static volatile uint32_t gTimCnt = 0; /* incremented every millisecond */


/*******************************************************************************
* Code
******************************************************************************/


/*!
* @brief SysTick计时器
*/
void SysTick_Handler(void)
{
        // 毫秒计数
        gTimCnt++;
}


/*! @brief CAN transfer callback function.

*/
void TransferCallback(CAN_Type *base, can_handle_t *handle, status_t status, uint32_t result, void *userData)
{
    can_frame_t *rxmsg;
    static uint32_t last_timestamp = 0;
    uint32_t timestamp;
    uint32_t time_diff;
  
    /* 来自CAN1的回调 */
        if (handle == &s_handle1)
    {
         /* 接收到消息缓冲区的消息 */
        if (status == (status_t)kStatus_CAN_RxIdle)
        {
             /* 获取接收数据 */
            rxmsg = handle->mbFrameBuf[result];
         
            /*时间戳为10us的倍数,自收到最后一条消息后开始计时 */
            timestamp = rxmsg->timestamp;
            if (timestamp >= last_timestamp)
                time_diff = timestamp - last_timestamp;
            else
                time_diff = (65536 - last_timestamp) + timestamp;
            /* 警告-此功能在CAN中断中执行,这里使用printf会影响性能并因此影响时间戳精度 */
            PRINTF("Rx 0x%X (%d x10us time diff)\r\n", rxmsg->id, time_diff);
            last_timestamp = timestamp;
            
            /* 切换LED2 */
            GPIO_TogglePinsOutput(GPIO, BOARD_LED2_GPIO_PORT, 1u << BOARD_LED2_GPIO_PIN);
            /* 使用此回调接收下一条消息 */
            CAN_TransferReceiveNonBlocking(CAN1, &s_handle1, &mb0rxfer);
        }
        /* FIFO接收完成 */
        else if (status == (status_t)kStatus_CAN_RxFifoIdle)
        {
            /* 结果保持先进先出数 */
            /* 从handle->rxFifoFrameBuf[result]中获取消息  */
        }
    }
}


/*!
* @brief Main function
*/
int main(void)
{
    can_config_t config;      //CAN模块配置结构体:基地址,时间戳频率,远程帧等
    can_frame_t txmsg = { 0 };   //发送消息帧结构体:字节长度,数据帧选择,帧格式,比特率切换,CANFD选择,时间戳等
    int b;
    bool message_transmitted = false;
    uint32_t next_id = 0x100;
    can_mb_transfer_t mbtxfer;
    can_frame_t rxmb0msg;


   /* 定义输出LED的初始化结构 */
    gpio_pin_config_t led_config = {
        kGPIO_DigitalOutput, 0,
    };


     /**** 引脚,时钟,调试初始化 */
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    CLOCK_EnableClock(kCLOCK_Gpio0);
    CLOCK_EnableClock(kCLOCK_Gpio1);
    CLOCK_EnableClock(kCLOCK_Gpio2);
    CLOCK_EnableClock(kCLOCK_Gpio3);


    BOARD_InitPins();
    BOARD_BootClockFROHF48M();
    BOARD_InitDebugConsole();


    /* print a note to terminal */
    PRINTF("\r\n CAN-FD driver callbacks example\r\n");


    /**** CAN模块配置     CAN初始化,CANFD模式,启用比特率切换,以1Mbps比特率和4MbPS数据比特率进行传输,传输64字节数据 */
    CAN_GetDefaultConfig(&config);      //获取默认的配置结构
    config.baseAddress = 0x20010000;    //缓冲区RAM基地址
    config.nominalBaudRate = 1000000;   //正常波特率1Mbps
    config.dataBaudRate = 4000000;      //数据传输波特率4Mbps
    config.timestampClock_Hz = 100000;  //100ms
    CAN_Init(CAN0, &config, SystemCoreClock);     //初始化CAN0:设置11位及29位滤波器,消息缓冲区
    CAN_Init(CAN1, &config, SystemCoreClock);


    /* receive 0x100 in CAN1 rx message buffer 0 by setting mask 0 */
    CAN_SetRxIndividualMask(CAN1, 0, CAN_RX_MB_STD(0x100, 0));
    /* receive 0x101 in CAN1 rx message buffer 0 by setting mask 1 */
    CAN_SetRxIndividualMask(CAN1, 1, CAN_RX_MB_STD(0x101, 0));
    /* receive 0x102 in CAN1 rx message buffer 0 by setting mask 2 */
    CAN_SetRxIndividualMask(CAN1, 2, CAN_RX_MB_STD(0x102, 0));


    /* create a handle for CAN0 for non-blocking send/receive */
    CAN_TransferCreateHandle(CAN0, &s_handle0, TransferCallback, NULL);
    /* create a handle for CAN1 for non-blocking send/receive */
    CAN_TransferCreateHandle(CAN1, &s_handle1, TransferCallback, NULL);


    CAN_Enable(CAN0, true);     // 使能CAN 0
   
    CAN_Enable(CAN1, true);     // 使能CAN 1


   
    /* 接收到CAN1 rx消息缓冲器0的消息是非阻塞的,并且当接收到回调函数时,
                将从CAN接收中断调用回调函数。 */
    mb0rxfer.frame = &rxmb0msg;
    mb0rxfer.mbIdx = 0;
    CAN_TransferReceiveNonBlocking(CAN1, &s_handle1, &mb0rxfer);


    /**** 启用SysTick 定时器 ****/
    SysTick_Config(SystemCoreClock / TICKRATE_HZ);


    /**** GPIO模块配置   初始化P0_8、P0_9、P1_14 ,3个LED,写操作默认输出di电平 ****/
    GPIO_PinInit(GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, &led_config);
    GPIO_WritePinOutput(GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, 0);
    GPIO_PinInit(GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN, &led_config);
    GPIO_WritePinOutput(GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN, 0);
    GPIO_PinInit(GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN, &led_config);
    GPIO_WritePinOutput(GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN, 0);


    GPIO_ClearPinsOutput(BOARD_LED1_GPIO, BOARD_LED1_GPIO_PORT, 1U << BOARD_LED1_GPIO_PIN);   /*!<  点亮LED1 */
    GPIO_ClearPinsOutput(BOARD_LED2_GPIO, BOARD_LED2_GPIO_PORT, 1U << BOARD_LED2_GPIO_PIN);   /*!< 点亮LED2 */


    while (true)
    {
        /* 时间到后从CAN0发送消息 */
        if ((gTimCnt % TRANSMIT_PERIOD == 0) && !message_transmitted)
        {
            /* send 0x100 -> 0x102 on tx message buffer 0 */
            txmsg.id = next_id;
            txmsg.format = kCAN_FrameFormatStandard;
            txmsg.type = kCAN_FrameTypeData;
            txmsg.proto = kCAN_ProtoTypeFD;
            txmsg.bitratemode = kCAN_BitrateModeTypeSwitch;
            txmsg.length = 64;
            for (b = 0; b < txmsg.length; b++) txmsg.dataByte = b;
            /* use message buffer 0 */
            mbtxfer.mbIdx = 0;
            mbtxfer.frame = &txmsg;
            CAN_TransferSendNonBlocking(CAN0, &s_handle0, &mbtxfer);
            
            /* 切换toggle LED1  在每次发送消息时切换LeD1 */
            GPIO_TogglePinsOutput(GPIO, BOARD_LED1_GPIO_PORT, 1u << BOARD_LED1_GPIO_PIN);
              
            message_transmitted = true;
            if (++next_id > 0x102) next_id = 0x100;
        }
        else if (gTimCnt % TRANSMIT_PERIOD != 0)
        {
            message_transmitted = false;
        }
    }
}


回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 10:02:10 | 显示全部楼层
小恩GG 发表于 2018-12-13 16:32
你说代码能下进去,你debug看下,代码跑死在哪里了?
你代码直接用内部晶振生成主频,然后再反转IO,看看灯 ...

这是主程序卡死的地方 4.jpg

回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 10:05:53 | 显示全部楼层
小恩GG 发表于 2018-12-12 13:40
楼主你好,默认可以使用内部的12M晶振的,所以如果外围最小系统没有问题,就算你不焊晶振也可以下载代码 ...

这是我用Jlink commander  识别的芯片    5.jpg

回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 10:13:31 | 显示全部楼层
ALTIUM2 发表于 2018-12-13 09:24
先用仿真器,看是否识别内核,然后在考虑程序问题

Jlink能够识别我的芯片,程序我用Keil  load成功了,Flash download里面的reset and run  我也设置了。  就是LED灯不亮,在线DEBUG的时候每次运行  他就卡在一个CAN使能的语句那儿,可是那个函数是我在官网上下载的例程,应该没有错误吧,我才刚刚接触代码   不知道该如何解决。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

39

帖子

0

注册会员

Rank: 2

积分
162
最后登录
2019-1-14
 楼主| 发表于 2018-12-14 11:38:51 | 显示全部楼层
小恩GG 发表于 2018-12-13 16:32
你说代码能下进去,你debug看下,代码跑死在哪里了?
你代码直接用内部晶振生成主频,然后再反转IO,看看灯 ...

好感谢你   我今天早上按照你说的一步步排查,然后现在灯亮了  ,爱死你啦。。。。还有个问题就是我代码写的是CAN-FD ,我要测CAN-FD的接口收发,能不能用CANPro分析仪进行分析啊~  能接收到CAN-FD数据吗
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24879
最后登录
2025-7-20
发表于 2018-12-14 17:36:33 | 显示全部楼层
suoyuedudu 发表于 2018-12-14 09:52
代码直接内部晶振生成主频,这一步要怎做啊   我的代码能力有点弱 也是刚刚接触。我用的是下载的固件库包 ...

你用的代码是哪里的,把代码来源给我看看,是官方的SDK吗?
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24879
最后登录
2025-7-20
发表于 2018-12-14 17:37:39 | 显示全部楼层
suoyuedudu 发表于 2018-12-14 11:38
好感谢你   我今天早上按照你说的一步步排查,然后现在灯亮了  ,爱死你啦。。。。还有个问题就是我代码 ...

很好,看到你排查成功,我也很高兴。
关于CAN-FD的接收,你需要用带有CAN FD功能的分析仪,否则是不能接收的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 20:11 , Processed in 0.110429 second(s), 31 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表