18978|29

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32的can问题太多了 [复制链接]

1.正常模式输出引脚没有信号
2.使用fifo1中断接受,根本不进中断,
3,列表模式lookback也巡行不对
 我以前发过很多can的帖子
不知道为什么没有一个st的人出来回答  是回避还是?
能不鞥给的例程多一点,资料太少了
此帖出自stm32/stm8论坛

最新回复

                                 你好!CAN的问题刚刚和ST的人一起到一个汽车电子客人那搞过,用示波器可以看到,你们厂在哪,我可以叫ST的人一起过去和你们演示一下.谢谢!我们是ST的代理,已与多家STM32客人在合作,经验丰富,可以提供你需要的帮助,需要在STM32上了解的请与我联系,谢谢!邓世宏 Simon Deng  文晔集团/庆成企业有限公司*************************************************************************************地址:深圳南山区科技园高新区南区南一道创维大厦C区3楼TEL:0755-2674 3880 转6139   FAX:0755-2674 4053M/P:13602587155E-mail: simon.deng@wtmec.comHttp: www.qce.co.hk    www.wtmec.comMSN: Sac87155@hotmail.comSkype: pcicsz   详情 回复 发表于 2008-10-9 15:07
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

芯片没问题

                                  
此帖出自stm32/stm8论坛
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

芯片没问题

                                 在万利板上要 Remap 一下,因为管脚不在默认状态
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 

这个当然知道 lookback有信号 正常模式就没信号了

还有我上面说的那些问题
   如果没问题,能否提供一个对接can互传成功的
               还有就是fifo1中断接受成功的
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 

stm

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 

STM32发送测试代码,可以运行

该代码是轮询模式,你将中断开启,在中断中处理相关操作就可以。

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
    debug();
#endif

    RCC_Configuration();        // System Clocks Configuration
    NVIC_Configuration();        // NVIC Configuration
    GPIO_Configuration();        // GPIO ports pins Configuration

    TestRx = CAN_Polling();        // CAN transmit at 100Kb/s and receive by polling in loopback mode

    if (TestRx == FAILED) {
        GPIO_SetBits(GPIOC, GPIO_Pin_4);        // Turn on led connected to PC.08 pin (LD3)
    }
    else {
        GPIO_SetBits(GPIOC, GPIO_Pin_6);        // Turn on led connected to PC.06 pin (LD1)
    }

    while (1) { }
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
    RCC_DeInit();    /* RCC system reset(for debug purpose) */
    RCC_HSEConfig(RCC_HSE_ON);    /* Enable HSE */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();    /* Wait till HSE is ready */
    if(HSEStartUpStatus == SUCCESS) {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        /* Enable Prefetch Buffer */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);         /* HCLK = SYSCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);     /* PCLK2 = HCLK */
        RCC_PCLK1Config(RCC_HCLK_Div2);        /* PCLK1 = HCLK/2 */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);        /* Select HSE as system clock source */
        while(RCC_GetSYSCLKSource() != 0x04) {        // Wait till HSE is used as system clock source 
        }
    }
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);    /* GPIOA and GPIOC clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);    /* CAN Periph clock enable */
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);        /* Configure PC.06, PC.07, PC.08 and PC.09 as Output push-pull */

    /* Enable the USART2 Pins Software Remapping */
    GPIO_PinRemapConfig(GPIO_Remap2_CAN, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOD, &GPIO_InitStructure);        /* Configure CAN pin: RX */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);        /* Configure CAN pin: TX */
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the NVIC and Vector Table base address.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM  
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);            /* Set the Vector Table base location at 0x20000000 */
#else    /* VECT_TAB_FLASH  */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);        /* Set the Vector Table base location at 0x08000000 */
#endif

    /* enabling interrupt */
    NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN_RX0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
* Function Name  : CAN_Polling
* Description    : Configures the CAN and transmit and receive by polling
* Input          : None
* Output         : None
* Return         : PASSED if the reception is well done, FAILED in other case
*******************************************************************************/
TestStatus CAN_Polling(void)
{
    u8 Error;

    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    CanTxMsg TxMessage;
    
    u32 i = 0;
    u8 TransmitMailbox;

    /* CAN register init */
    CAN_DeInit();
    CAN_StructInit(&CAN_InitStructure);

    /* CAN cell init */
    CAN_InitStructure.CAN_TTCM = DISABLE;
    CAN_InitStructure.CAN_ABOM = DISABLE;
    CAN_InitStructure.CAN_AWUM = DISABLE;
    CAN_InitStructure.CAN_NART = DISABLE;
    CAN_InitStructure.CAN_RFLM = DISABLE;
    CAN_InitStructure.CAN_TXFP = DISABLE;
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;    // CAN_Mode_LoopBack
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
    CAN_InitStructure.CAN_Prescaler = 5;
    Error = CAN_Init(&CAN_InitStructure);
    if (Error == 0)
        return FAILED;

    /* CAN filter init */
    CAN_FilterInitStructure.CAN_FilterNumber = 0;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;    //0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

    /* transmit */
    TxMessage.StdId = 0x18;
    TxMessage.RTR = CAN_RTR_DATA;
    TxMessage.IDE = CAN_ID_STD;
    TxMessage.DLC = 8;
    TxMessage.Data[0] = 0x40;
    TxMessage.Data[1] = 0x40;
    TxMessage.Data[2] = 0x45;
    TxMessage.Data[3] = 0x51;
    TxMessage.Data[4] = 0x52;
    TxMessage.Data[5] = 0x65;
    TxMessage.Data[6] = 0x61;
    TxMessage.Data[7] = 0x64;        // @@EQRead

    TransmitMailbox = CAN_Transmit(&TxMessage);

    i = 0;
    while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF)) {
        i++;
    }

    return PASSED;        // Test Passed
}
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 

接收测试代码


/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
    RCC_DeInit();                                    // RCC system reset(for debug purpose)
    RCC_HSEConfig(RCC_HSE_ON);                        // Enable HSE
    HSEStartUpStatus = RCC_WaitForHSEStartUp();        // Wait till HSE is ready
    if(HSEStartUpStatus == SUCCESS) {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        // Enable Prefetch Buffer
        RCC_HCLKConfig(RCC_SYSCLK_Div1);             // HCLK = SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);             // PCLK2 = HCLK
        RCC_PCLK1Config(RCC_HCLK_Div2);                // PCLK1 = HCLK/2
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);        // Select HSE as system clock source
        while(RCC_GetSYSCLKSource() != 0x04) {        // Wait till HSE is used as system clock source
        }
    }
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);    /* GPIOA and GPIOC clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);    /* CAN Periph clock enable */
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);            // Configure PC.06, PC.07, PC.08 and PC.09 as Output push-pull

    GPIO_PinRemapConfig(GPIO_Remap2_CAN, ENABLE);    // Enable the USART2 Pins Software Remapping

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOD, &GPIO_InitStructure);            // Configure CAN pin: RX

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);            // Configure CAN pin: TX
}

/*******************************************************************************
* Function Name  : CAN_Configuration
* Description    : Configures the CAN
* Input          : None
* Output         : None
* Return         : PASSED if the configration is well done, FAILED in other case
*******************************************************************************/
TestStatus CAN_Configuration(void)
{
    u8 Error;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;

    CAN_DeInit();            // CAN register init
    CAN_StructInit(&CAN_InitStructure);

    CAN_InitStructure.CAN_TTCM = DISABLE;
    CAN_InitStructure.CAN_ABOM = DISABLE;
    CAN_InitStructure.CAN_AWUM = DISABLE;
    CAN_InitStructure.CAN_NART = DISABLE;
    CAN_InitStructure.CAN_RFLM = DISABLE;
    CAN_InitStructure.CAN_TXFP = DISABLE;
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
    CAN_InitStructure.CAN_Prescaler = 5;
    Error = CAN_Init(&CAN_InitStructure);        // CAN cell init

    if (Error == 0)
        return FAILED;

    CAN_FilterInitStructure.CAN_FilterNumber = 0;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0300;        // StdId << 20 | ExID << 2 | IDE << 1 |    RTR
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;        // StdId << 20 | ExID << 2 | IDE << 1 |    RTR
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0300;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);    // CAN filter init

    return PASSED;
}

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
    CanRxMsg RxMessage;
    u32 i = 0;

#ifdef DEBUG
    debug();
#endif

    RCC_Configuration();            // System Clocks Configuration
    NVIC_Configuration();            // NVIC Configuration
    GPIO_Configuration();            // GPIO ports pins Configuration

    do {
        TestRx = CAN_Configuration();    // CAN transmit at 100Kb/s and receive by polling in loopback mode
    } while (TestRx == 0);

    /* receive */
    RxMessage.StdId = 0x00;
    RxMessage.IDE = CAN_ID_STD;
    RxMessage.DLC = 0;
    for (i = 0; i < 8; i++) {
        RxMessage.Data = 0x00;
    }

    while (1) {
        if (CAN_MessagePending(CAN_FIFO0)) {
            CAN_Receive(CAN_FIFO0, &RxMessage);
            TestRx = PASSED;
            if (RxMessage.StdId!=0x11)
                TestRx = FAILED;

            if (RxMessage.IDE!=CAN_ID_STD)
                TestRx = FAILED;

            if (RxMessage.DLC!=2)
                TestRx = FAILED;

            if ((RxMessage.Data[0] << 8 | RxMessage.Data[1]) != 0xCAFE)
                TestRx = FAILED;

            if (TestRx == FAILED) {
                GPIO_SetBits(GPIOC, GPIO_Pin_4);        // Turn on led connected to PC.08 pin (LD3)
            }
            else {
                GPIO_SetBits(GPIOC, GPIO_Pin_6);        // Turn on led connected to PC.06 pin (LD1)
            }
        }
    }
}
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 

CAN有个特点

节点数为1时,如果不用回环模式,是咱都不会正常的.
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 

我想知道 这个是你测试过了的吧应该

                                 但是在我这里为什么 发送端  用示波器就没有信号呢。  还有两个can之间相连,硬件有什么要求吗  还有就是我就随便两个单独的线可以吧
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 

如果不是自测模式,似乎发送引脚应该没有信号

                                 两个CAN节点相连,终端电阻匹配了没有?
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

11
 

为什么正常模式 会没有信号呢?

                                 并联了电阻  对于硬件连接还请您指点
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 

ding上来

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 

re

如果lookback下能用示波器看到信号就没有问题的

在正常模式下看不到信号,应该是总线错误导致bus off了

你要保证在任何时刻下总线至少有两个"有效"的can设备,可以应答对方,要不然发255次就bus off了.而且这255次发送是自动尝试的,只要你启动一次发送而收不到应答

你可以调试一下,检查can有关寄存器,看是不是bus off了
另外在第一次发送的时候,你可以用示波器看到波形的,但是很快就没有了,也不能再发送了,因为已经bus off了.

总之lookback下能用示波器看到信号就说明没有问题
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 

谢谢 楼上

                                 还有一个问题   硬件连接有什么要求吗 电阻之类的
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 

两个设备是指用的容错型CAN吧?

                                 高速型的好像两个不够?
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

16
 

问题可能没remap

                                 remap以后一定要RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);    开下RCC_APB2Periph_AFIO时钟
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

17
 

我迷茫了 请教调试can的方法

                                 我只有带can的开发板  两个  怎么调试呢  对连不可以吗
此帖出自stm32/stm8论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

18
 

很明显

                                 不是芯片的问题.CAN调试的正常模式需要至少两个节点.难道LZ连CAN协议都没看过就开始动手了?
此帖出自stm32/stm8论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

19
 

请教楼上

                                 能指点一下怎么调试吗  要几个can  硬件有什么要求?
此帖出自stm32/stm8论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

20
 

re

两个板就可以了

调试的话硬件没什么很严格的要求啊,连起来就可以了

把波特率设置低一点

你首先在loopback模式单独调好每块板(能正常收发),然后连起来切到正常模式就可以了,要记得波特率相同,要不又bus off了
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表