2012-11-22 1 views
2

이 단계에서 STM32F103 V8T6에서 CAN을 사용하여 전송을 보내려고합니다. 칩은 회사에서 사용자 정의한 보드에 구현됩니다. 도식을 보면 CAN Tx 및 Rx 핀이 PB9 (Tx) 및 PB8 (Rx)으로 재 매핑되었음을 알 수 있습니다. 모든 말, 나는 루프 모드를 성공적으로 사용할 수 있었지만 (STM "V3.5.0"의 최신 예를 사용하여) 정상 모드를 작동시키지 못했습니다. 누군가 내 초기 구성에 명백한 결함이 있는지 알려주십시오. 구성과 관련된 코드 만 포함하고 전송 함수 호출을 생략했습니다.CAN 용 STM32103 구성 및 PB8 및 PB9 로의 핀 재 매핑

int main (void) 
{ 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 



NVIC_InitTypeDef NVIC_InitStructure; 

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; 

NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

NVIC_Init(&NVIC_InitStructure); 



GPIO_InitTypeDef GPIO_InitStructure; 


/* Configure CAN pin: RX */ 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 

GPIO_Init(GPIOB, &GPIO_InitStructure); 


/* Configure CAN pin: TX */ 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 

GPIO_Init(GPIOB, &GPIO_InitStructure); 


// Remap2 is for PB8 and PB9 

GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE); 


} 

여기 내 전송 기능

void CAN_TransmitMyMsg(void) 
{ 
    CAN_InitTypeDef  CAN_InitStructure; 
    CAN_FilterInitTypeDef CAN_FilterInitStructure; 
    CanTxMsg TxMessage; 
    uint32_t i = 0; 
    uint8_t TransmitMailbox = 0; 
    uint8_t status = 0; 

    /* CAN register init */ 
    CAN_DeInit(CANx); 
    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; 

    /* Baudrate = 125kbps*/ 
    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; 
    CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; 
    CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; 
    CAN_InitStructure.CAN_Prescaler=48; 
    CAN_Init(CANx, &CAN_InitStructure); 

    /* 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=0; 
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
    CAN_FilterInit(&CAN_FilterInitStructure); 

    /* transmit */ 
    TxMessage.StdId=0x11; 
    TxMessage.RTR=CAN_RTR_DATA; 
    TxMessage.IDE=CAN_ID_STD; 
    TxMessage.DLC=2; 
    TxMessage.Data[0]=0xCA; 
    TxMessage.Data[1]=0xFE; 

    TransmitMailbox=CAN_Transmit(CANx, &TxMessage); 

    //wait until CAN transmission is OK 
    i = 0; 
    while((status != CANTXOK) && (i != 0xFFFF))    
    { 
    status = CAN_TransmitStatus(CANx, TransmitMailbox); 
    i++; 
    } 

} 

이 리소스가 도움이되었습니다 만, 궁극적으로 부족하다.

STM32F103 microcontroller CAN messages

감사합니다!

다니엘

+0

우선, 실제 버스 작업 (케이블, 터미네이터 등)을 수행합니까? 실제로 전송 된 것이 있습니까 (저장 영역, CAN anlyser 등)? tx 및 rx 채널에서보고 된 오류는 무엇입니까? 블로그로 하드웨어를 디버깅하길 기대하십니까? –

+0

나는 CAN을 매우 처음 사용한다고 기록에 남겨 두어야합니다. 보드의 출력 핀은 권장대로 끝나는 메이크 시프트 보드에 연결됩니다 (끝 부분에 120 ohms). 여기에는 MAX USB를 사용하여 전송을 감지하고 표시하는 것으로 간주되는 "수신 전용"으로 설정된 NI USB-8472가 첨부됩니다. 실제로 하드웨어 문제가 될 수는 있지만 현재로서는 알 수있는 방법이 없으므로 적어도 소프트웨어는 건전하다는 것을 확신합니다. – Daniel

답변

1

나는 비슷한 문제가 있었다. 내 문제는 내가이 방법으로 그것을 디버깅 통신 매개 변수 (timequantums 및 프리스케일러)

의 나쁜 선택이었다 : 나는 확인

  • , CAN 트랜시버의 RSS 핀은
  • (I는 MCP 2551 I/P를 사용)
  • 루프백으로 전환하고 TX 채널에서 osciloscope 확인 출력 신호를 사용하고 CANH에서 CANL (출력이 올바르게 구성되어있는 경우)으로 전환했습니다.
  • APB1 클럭의 프리스케일러가 2로 변경되었습니다. 예외 4)
0

GPIO_Remap2_CAN1은 CAN1 주변 장치를 PB0 및 PD1이 아닌 PB8 및 PB9로 다시 매핑합니다. GPIO_Remap1_CAN1을 원합니다.

0

성공적인 전송을 위해 CAN 컨트롤러는 CAN 프로토콜의 일부인 'acknowledge'비트를 기대합니다. CAN 모니터 (NI 제공)가 청취 모드에있는 경우 확인 비트 (!)가 없으므로 송신 측에서 성공적인 전송 표시를 얻지 못합니다.