打印
[应用相关]

stm32的can 问题太多了

[复制链接]
11109|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dkill|  楼主 | 2008-8-1 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.正常模式输出引脚没有信号
2.使用fifo1中断接受,根本不进中断,
3,列表模式lookback也巡行不对
 我以前发过很多can的帖子
不知道为什么没有一个st的人出来回答  是回避还是?
能不鞥给的例程多一点,资料太少了
来自 2楼
ST_ARM| | 2008-8-1 15:19 | 只看该作者

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
}

使用特权

评论回复
板凳
zhang..yb| | 2008-8-1 14:21 | 只看该作者

芯片没问题

使用特权

评论回复
地板
zhang..yb| | 2008-8-1 14:25 | 只看该作者

芯片没问题

在万利板上要 Remap 一下,因为管脚不在默认状态

使用特权

评论回复
5
dkill|  楼主 | 2008-8-1 14:39 | 只看该作者

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

还有我上面说的那些问题
   如果没问题,能否提供一个对接can互传成功的
               还有就是fifo1中断接受成功的

使用特权

评论回复
6
dkill|  楼主 | 2008-8-1 14:53 | 只看该作者

stm

使用特权

评论回复
7
ST_ARM| | 2008-8-1 15:21 | 只看该作者

接收测试代码


/*******************************************************************************
* 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)
            }
        }
    }
}

使用特权

评论回复
8
lianshumou| | 2008-8-1 16:46 | 只看该作者

CAN有个特点

节点数为1时,如果不用回环模式,是咱都不会正常的.

使用特权

评论回复
9
dkill|  楼主 | 2008-8-1 16:51 | 只看该作者

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

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

使用特权

评论回复
10
三块石头| | 2008-8-1 17:15 | 只看该作者

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

两个CAN节点相连,终端电阻匹配了没有?

使用特权

评论回复
11
dkill|  楼主 | 2008-8-1 17:25 | 只看该作者

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

并联了电阻  对于硬件连接还请您指点

使用特权

评论回复
12
dkill|  楼主 | 2008-8-1 17:53 | 只看该作者

ding上来

使用特权

评论回复
13
neaphy| | 2008-8-1 21:27 | 只看该作者

re

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

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

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

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

总之lookback下能用示波器看到信号就说明没有问题

使用特权

评论回复
14
dkill|  楼主 | 2008-8-1 22:01 | 只看该作者

谢谢 楼上

还有一个问题   硬件连接有什么要求吗 电阻之类的

使用特权

评论回复
15
walnutcy| | 2008-8-2 08:29 | 只看该作者

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

高速型的好像两个不够?

使用特权

评论回复
16
hzrobin| | 2008-8-2 08:53 | 只看该作者

问题可能没remap

remap以后一定要RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);    开下RCC_APB2Periph_AFIO时钟

使用特权

评论回复
17
dkill|  楼主 | 2008-8-2 16:28 | 只看该作者

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

我只有带can的开发板  两个  怎么调试呢  对连不可以吗

使用特权

评论回复
18
wlq_9| | 2008-8-2 16:46 | 只看该作者

很明显

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

使用特权

评论回复
19
dkill|  楼主 | 2008-8-2 17:27 | 只看该作者

请教楼上

能指点一下怎么调试吗  要几个can  硬件有什么要求?

使用特权

评论回复
20
neaphy| | 2008-8-2 19:38 | 只看该作者

re

两个板就可以了

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

把波特率设置低一点

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

201

帖子

0

粉丝