can和rs485又有些类似,都是把ttl旗子暗记转换成了差分旗子暗记。以是在stm32 利用can的时候会有一个can收发器。
从电路上看起来也很大略,stm32也是通过can tx、rx两根线和收发器相连。以是如果我们要测试can的发送,是不是只接can tx脚就可以了?
我最开始也以为这样就可以,但是穷究can的总线冲突检测事理就会创造这样行不通的。由于can 在发送数据的时候也会同时吸收发送的数据,通过把吸收的数据和内部发送寄存器的数据做比拟,是不是同等就知道总线有没有冲突。以是在正常情形(这里意味着非正常情形下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失落败。
以是要担保发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
硬件上就这些紧张把稳点,接下来就紧张是软件的配置了。
一样平常stm32 配置can有以下几大步骤:
can的初始化(cubemx直接可以天生代码)can的启动can滤波器的设置(用来吸收的,发送的时候可以不用配置它)can实行发送数据要求我们只测试can的发送,以是就只用关系1、2、4步骤就可以了。
第一步,配置stm32cubemx(基于stm32f072cb)如上图所示,最关键紧张配置如下三个参数,分频数我这里配置48,下面的time Quantum值就会自动打算出来。由于can时钟是48mhz经由48分频后,一个单位韶光便是1us=1000ns。
由于我想要100k波特率,然后填写下面的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。那么详细波特率该怎么打算还是要看看官方手册的描述:
根据如上描述,能决定波特率的也便是三个参数:分频值、Tbs1、Tbs2。须要把稳的是,这个SYNC_SEG的1tq是固定值。和stm32cubemx中的jump width不要弄稠浊了。jump width这个韶光参数是作为补偿韶光的上线,当时间有偏差的时候,就会自动补偿,最永劫光不能超过该参数设定值。
配置完往后就可以天生MDK工程了。
第二步:启动can通过stm32cubemx天生的工程就已经配置好了can参数,我们直接调用一条语句就可以启动can。
HAL_CAN_Start(&hcan);第三步:发送数据
can数据和串口数据不同,你写0x55就发送0x55。而can的数据都因此包为单位的,以是要发送数据我们就要添补包,在程序里面便是添补构造体,添补完往后进行发送要求。
CAN_TxHeaderTypeDef TxHeader;uint8_t TxData[8]="12345678";uint32_t TxMailbox;TxHeader.StdId = 0x321;TxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD;TxHeader.DLC = 8;TxHeader.TransmitGlobalTime = DISABLE;if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)==HAL_OK){ HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);}
如果硬件没问题,这时候通过can总线就可以吸收到发送的数据。(这个要通过pc吸收就须要一个usb can吸收的硬件工具)。
莫慌,还没完……记不记得在前面,我们提到过在正常情形下can rx和can tx引脚都须要连接到can 收发器。那么实际上stm32 除了正常模式还有几种分外模式:
slient mode(静音模式)Loopback mode(回环模式)Loopback and slient mode通过上图可以很随意马虎明白这几种模式差异:
正常模式:内部的tx和外部TX引脚相连,内部rx和外部RX引脚相连;内部rx和tx是不相连的。
静音模式:can可以吸收外部的数据但是发送不出去,同时内部tx和rx相通
回环模式:can可以发送出去数据但是吸收不到外部的数据,同时内核tx和rx相通
以是在回环模式下就可以实现CAN RX引脚不吸收发器也能发送出来数据。