我现在使用stm32跟atm91sam7x256的can无法连起来,stm32跟stm32可以连,7x256跟7x256可以连
STM32 时钟配置(8M晶振):
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
STM32 CAN速率配置(500k):
CAN_InitStructure.CAN_SJW = CAN_SJW_4tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;
CAN_InitStructure.CAN_Prescaler = 4;
7X256 时钟配置(18.432M晶振)
///////////////////////////////////////////////////////////////////////////
// Init PMC Step 2.
// Set PLL to 96MHz (96,109MHz) and UDP Clock to 48MHz
// PLL Startup time depends on PLL RC filter: worst case is choosen
// UDP Clock (48,058MHz) is compliant with the Universal Serial Bus
// Specification (+/- 0.25% for full speed)
///////////////////////////////////////////////////////////////////////////
AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1 |
(16 << 8) |
(AT91C_CKGR_MUL & (72 << 16)) |
(AT91C_CKGR_DIV & 14);
// Wait for PLL stabilization
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) );
// Wait until the master clock is established for the case we already
// turn on the PLL
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
///////////////////////////////////////////////////////////////////////////
// Init PMC Step 3.
// Selection of Master Clock MCK equal to (Processor Clock PCK) PLL/2=48MHz
// The PMC_MCKR register must not be programmed in a single write operation
// (see. Product Errata Sheet)
///////////////////////////////////////////////////////////////////////////
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
// Wait until the master clock is established
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
7X256 CAN速率配置(500k):
//AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN, 0x00053255);
上面这行是照例程中的设置,但与手册中的数据不符
AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN, 0x00053045);
目前的问题应该是两者之间速率不匹配导致无法通信,由于没有标准的can设备,不知道哪个是正确的配置,请大家帮我看看是哪的问题,谢谢!
自己用示波器测一下,比较一下很容易找到原因的
还可以用示波器同时看两个MCU的波形,然后调整软件参数使得两个波形一致。
补充
7X256 CAN速率:
AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN, 0x00053045);
其中: tPHS2 为6, tPHS1为5, tPRS为1, tSJW为4,CAN时钟为主频的6分频
试过其它速率也不行
发现一个很奇怪的现象
7X256速率配置成0x00052233居然能通信了
其中: tPHS2 为4, tPHS1为4, tPRS为3, tSJW为3,CAN时钟为主频的6分频
波特率为:48000000/6/(4+4+3+3)=571.428k
真是奇怪,难度两边的频率发生了很大的差别?晶振不准?没示波器真难调
波特率计算错误
你两块同样的板子用的同一个程序,所以能通信。
re:有用stm32的can跟其它设备连过的朋友没有?
我用STM32的CAN 跟 LEXUS 車上的ECU用500K的速率
通信目前為止都還 OK!
也跟 SJA-1000 CAN 模組測試過都 OK
CAN BUS 終端電阻一定要接才能得到可靠的通信品質。
现在两边可以通信了
zjf0000:
是哪边计算错了?
xobd:已接120欧终端电阻
发现一个有趣现象,无意中将stm32 can速度配置成了4M(CAN最高1M,不知道是否真的是4M),两个stm32居然能通起来,但跟7x256 can就无法通了,如果都是1M就可以通信
现在发现新的ATMEL提供的库中计算7x256的函数似乎有问题