打印

STM can的问题,loopback模式,cantx波形是这样,说明了什么?

[复制链接]
4623|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
搞了很久了,改成正常模式后,数据好像一直发不出去,但是loopback模式能收发成功,可是管脚上就是没什么信号,文档里说会有的。我把收发器拆掉了,应该不是硬件问题。

沙发
相信哥咯|  楼主 | 2011-7-23 13:07 | 只看该作者
搞定了,草他码得,是芯片坏了,草

使用特权

评论回复
板凳
相信哥咯|  楼主 | 2011-7-23 13:55 | 只看该作者
本帖最后由 相信哥咯 于 2011-7-23 13:58 编辑

用了一段时间好像又没波形了???
重启重烧也没了。


使用特权

评论回复
地板
相信哥咯|  楼主 | 2011-7-23 15:41 | 只看该作者
本帖最后由 相信哥咯 于 2011-7-23 15:43 编辑

----------------------------------
我快被它搞残了
------------------------------------------
main()
   {
         unsigned int a;
         RCC_Configuration();
                       /*初始化 GPIOC时钟*/
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
   USART_Configuration();
   Delay(10);
   CAN_configure();
  // LedInit();
   
   while(1)
   {
                   //CAN_ClearFlag(CAN_FLAG_BOF);
                   GPIO_SetBits(GPIOB,GPIO_Pin_7);
                Delay(10);
                GPIO_ResetBits(GPIOB,GPIO_Pin_7);
                Delay(10);
                GPIO_SetBits(GPIOB,GPIO_Pin_7);
                Delay(10);
                GPIO_ResetBits(GPIOB,GPIO_Pin_7);
                Delay(10);
                can_send(0x57);
                a=can_rev();
                USART1_Putc(a);
               
   }


   }


--------------------------------------------------------------------------------------------------
#include"stm32f10x_lib.h"
void CAN_configure(void)
{
                 u8 wrong;
                 CAN_InitTypeDef CAN_InitStructure;
                CAN_FilterInitTypeDef CAN_FilterInitStructure;
                GPIO_InitTypeDef GPIO_InitStructure;
           
        //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
        //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
         //        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
   
            /* Configure CAN pin: RX */
                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
                  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
          /* Configure CAN pin: TX */
                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                  GPIO_Init(GPIOA, &GPIO_InitStructure);


        
        /*can register int*/
                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_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;
                  wrong=CAN_Init(&CAN_InitStructure);
                  while(wrong==CANINITFAILED){}

    /* 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;//((u32)0x0020<<21)>>16;//标识符
                  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//(((u32)0x0020<<21)|CAN_ID_STD|CAN_RTR_DATA);//
                  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
                  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
                 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;;
                 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
                  CAN_FilterInit(&CAN_FilterInitStructure);
           //         CAN_ITConfig(CAN_IT_FMP0, ENABLE);

   
   

}


void can_send(unsigned char data)
{
           
                CanTxMsg TxMessage;
                u8 TransmitMailbox = 0;                       
                TxMessage.StdId=0x0020;//标识符
                  TxMessage.RTR=CAN_RTR_DATA;
                 TxMessage.IDE=CAN_ID_STD;
                  TxMessage.DLC=2;
                  TxMessage.Data[0]=data;
                  TxMessage.Data[1]=0xFE;

                  TransmitMailbox=CAN_Transmit(&TxMessage);
                   while(CAN_TransmitStatus(TransmitMailbox) != CANTXOK){}//等待发送
        
}

unsigned char can_rev(void)
{
                 CanRxMsg RxMessage;

                  RxMessage.StdId=0x11;//不需要设置
                  RxMessage.IDE=CAN_ID_STD;
                  RxMessage.DLC=2;
                  RxMessage.Data[0]=0x00;
                  RxMessage.Data[1]=0x00;
                  while (CAN_MessagePending(CAN_FIFO0)==0);//等到接收
   
                   CAN_Receive(CAN_FIFO0, &RxMessage);
                CAN_FIFORelease(CAN_FIFO0);
        
  return    RxMessage.Data[0];
}










-------------------------------------------------------------------------------------------------
void RCC_Configuration(void)

{
//***
  ErrorStatus HSEStartUpStatus;

  //***
     
    //* system clocks configuration -----------------系统时钟配置-------------------///

    //* RCC system reset(for debug purpose) //

    RCC_DeInit();                                    //将外设RCC寄存器重设为缺省值

    //* Enable HSE *

    RCC_HSEConfig(RCC_HSE_ON);                    //开启外部高速晶振(HSE)

    //* Wait till HSE is ready /

     
    HSEStartUpStatus = RCC_WaitForHSEStartUp();    //等待HSE起振

    if(HSEStartUpStatus == SUCCESS)               //若成功起振,(下面为系统总线时钟设置)

    {

    //* Enable Prefetch Buffer /

   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取指缓存

    //* Flash 2 wait state /

   FLASH_SetLatency(FLASH_Latency_2);   //设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值)

   

    //* HCLK = SYSCLK /

  RCC_HCLKConfig(RCC_SYSCLK_Div1);   //设置AHB时钟=72 MHz

    //* PCLK2 = HCLK/2 /

   RCC_PCLK2Config(RCC_HCLK_Div2);   //设置APB1时钟=36 MHz(APB1时钟最大值)

   //* PCLK1 = HCLK/2 /

   RCC_PCLK1Config(RCC_HCLK_Div2);   //设置APB2时钟=72 MHz

   //* Configure ADCCLK such as ADCCLK = PCLK2/2 /

  // RCC_ADCCLKConfig(RCC_PCLK2_Div2); //RCC_PCLK2_Div2,4,6,8

   //* PLLCLK = 8MHz * 9 = 72 MHz /

   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数)

   //* Enable PLL /

   RCC_PLLCmd(ENABLE);

    //* Wait till PLL is ready /

   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

   {

   }

    //* Select PLL as system clock source /

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

   //* Wait till PLL is used as system clock source /

   while(RCC_GetSYSCLKSource() != 0x08)

   {

   }  

}
  

  //*****
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

    //***/


}

使用特权

评论回复
5
自然的天逸| | 2011-7-23 17:31 | 只看该作者
芯片坏了 外部电路有问题

使用特权

评论回复
6
相信哥咯|  楼主 | 2011-7-23 19:05 | 只看该作者
本帖最后由 相信哥咯 于 2011-7-23 19:08 编辑

谢谢楼上的回复,老大帮忙解决了,原来第一幅图那尖尖的东西也是波形,我主函数里延迟有问题。。对示波器还不够理解。。

使用特权

评论回复
7
vhuanyou| | 2011-7-23 20:30 | 只看该作者

使用特权

评论回复
8
bnyuli| | 2011-7-24 10:53 | 只看该作者
芯片坏了 外部电路有问题

使用特权

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

本版积分规则

4

主题

927

帖子

1

粉丝