简体   繁体   English

stm32f4 发现 CAN 传输

[英]stm32f4 discovery CAN transmit

This is my program for CAN transmit.这是我的CAN传输程序。 I just want to see through the oscilloscope wether something is being sent or not.我只想通过示波器查看是否正在发送某些内容。 I am using stm32f407 and attolic true studio for it, but i am unable to see any signal on my tx pin.我正在使用 stm32f407 和 attolic true studio,但我在 tx 引脚上看不到任何信号。 Kindly tell me where is my mistake.请告诉我我的错误在哪里。 Do i need to connect the transciever externally and also how can i access CAN_H and CAN_L pins.我是否需要在外部连接收发器,以及如何访问 CAN_H 和 CAN_L 引脚。

#include "stm32f4xx.h"
int main(void)
{
  GPIO_InitTypeDef      GPIO_InitStructure;

  RCC_ClocksTypeDef     RCC_Clocks;
CAN_InitTypeDef       CAN_InitStructure;
 CAN_FilterInitTypeDef CAN_FilterInitStructure;
  CanTxMsg TxMessage;
 RCC_GetClocksFreq(&RCC_Clocks);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);`
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
CAN_DeInit(CAN1);
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_6tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler = 4;
  CAN_Init(CAN1, &CAN_InitStructure);
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;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
  // transmit */
TxMessage.StdId= 0x123;
TxMessage.ExtId= 0x00;
TxMessage.RTR= CAN_RTR_DATA;
TxMessage.IDE= CAN_ID_STD;
TxMessage.DLC= 4;
TxMessage.Data[0]= 0x02;
TxMessage.Data[1]= 0x11;
TxMessage.Data[2]=0x11;
TxMessage.Data[3]=0x11;

while(1)
{

volatile uint_t i;

unit8_t TransmitMailbox= 0;
//sprintf(TxMessage.Data, "Imran\n");


TransmitMailbox= CAN_Transmit(CAN1,&TxMessage);

i=0;
while((CAN_TransmitStatus(CAN1,TransmitMailbox) !=CANTXOK)&& (i !=0xFFFFFF))
{
i++;
} 
}
 }

Try to turn on the Automatic Wake Up by changing to the following line:尝试通过更改为以下行来打开自动唤醒:

CAN_InitStructure.CAN_AWUM = ENABLE;        

The stm32f407 has only the CAN Controller without the internal transciever, so you need to connect it externaly. stm32f407只有CAN控制器,没有内部收发器,所以需要外接。 Also you have to connect another device into your CAN Bus to see something (remember about the terminators).此外,您必须将另一个设备连接到您的 CAN 总线上才能看到一些东西(记住关于终结器)。

Please explain what do you mean by saying that:请解释你说的意思是什么:

how can i access CAN_H and CAN_L pins  

PS.附注。 You should not put each functionality into one routine because it is unreadable.您不应该将每个功能都放在一个例程中,因为它是不可读的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM