<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=23438&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-11-17T21:40:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=23438&amp;mode</id>
<entry>
<author><name><![CDATA[amilo_pa]]></name></author>
<updated>2020-11-17T21:40:52+01:00</updated>
<published>2020-11-17T21:40:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23438&amp;p=229867#p229867</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23438&amp;p=229867#p229867"/>
<title type="html"><![CDATA[STM32F103 + CAN -&gt; procek nie wypuszcza ramki z banków FIFO]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23438&amp;p=229867#p229867"><![CDATA[
Hej wszystkim,<br /><br />Mam mały problem z zaimplementowaniem protokołu CAN na STM32F103 (tzw bluepillu). Ale po kolei.<br /><br /><br />Mam Bluepilla podłączonego poprzez PA11 (CAN_Rx) i PA12 (CAN_Tx) do transceivera CJMCU-1051 (wejscia CRX -&gt; PA11 i CTX -&gt; PA12 ). Sygnały CANL oraz CANH wychodzące z transceivera)  mam połączone z magistralą CAN na któej są już dwie nody i komunikują się ze sobą z baudratem =  500kBps  (po sieci biegają 4 ramki):<br /><a href="https://obrazkiforum.atnel.pl/3824/792072ea3912f29c4756391c60f6e04d.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/792072ea3912f29c4756391c60f6e04d.png" alt="Obrazek" /></a><br /><br />Więc sieć dzial.<br /> <br />I teraz mój kod.<br />Konfiguracja zegarów na maksymalne taktowanie - 72MHz ( PCLK1 zgodnie z RM ustawone na 36MHz):<br />[syntax=c]void RCC_Conf(void)<br />{<br />  // RCC setting reset<br />  RCC_DeInit();<br /><br />  // Turn on HSE<br />  RCC_HSEConfig(RCC_HSE_ON);<br /><br />  // Wait up to HSE will be ready<br />  HSEStartUpStatus = RCC_WaitForHSEStartUp();<br /><br />  if(HSEStartUpStatus == SUCCESS)<br />  {<br />  /*<br />   * the introduction of delays is (waitstate) for higher clock rates<br />   * is due to the maximum frequency with which it is performed<br />   * communication with Flash memory can be 24 MHz<br />   */<br />  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);<br /><br />  // wait for flash memory<br />  FLASH_SetLatency(FLASH_Latency_2);<br /><br />  // HCLK = SYSCLK<br />  RCC_HCLKConfig(RCC_SYSCLK_Div1);<br /><br />  // PCLK2 = HCLK<br />  RCC_PCLK2Config(RCC_HCLK_Div1);<br /><br />  // PCLK1 = HCLK/2<br />  RCC_PCLK1Config(RCC_HCLK_Div2);<br /><br />  // PLLCLK = 8MHz * 9 = 72 MHz<br />  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);<br /><br />  // Turn on PLL<br />  RCC_PLLCmd(ENABLE);<br /><br />  // Wait up to PLL will be ready<br />  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);<br /><br />  // Select PLL as source of clock<br />  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);<br /><br />  // Wait up to PLL will be the source of clock<br />  while(RCC_GetSYSCLKSource() != 0x08);<br /><br />  // Turn on Włączenie clock signal supervision system<br />  //RCC_ClockSecuritySystemCmd(ENABLE);<br /><br />  }<br /><br />}[/syntax]<br /><br />SysTick skonfigurowany na 1ms:<br /><br />[syntax=c]void SysTick_Conf (void)<br />{<br />SysTick_Config(F_PCLK2/8/1000);<br />SysTick-&gt;CTRL &amp;= ~SysTick_CTRL_CLKSOURCE_Msk;<br />}[/syntax]<br /><br />No i czas na konfigurację CANa:<br /><br />[syntax=c]void CAN_Config(void)<br />{<br />  GPIO_InitTypeDef  GPIO_InitStructure;<br />  uint8_t ststus = 10;<br /><br />  /* Configure CAN1 IOs **********************************************/<br />  /* GPIOA and AFIO clocks enable */<br />  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);<br /><br />  /* Configure CAN1 RX pin */<br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IPU//GPIO_Mode_AF_PP;<br />  GPIO_Init(GPIOA, &amp;GPIO_InitStructure)<br /><br />  /* Configure CAN1 TX pin */<br />  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;<br />  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />  GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br /><br />  /* Configure CAN1 and CAN2 **************************************************/<br />  /* CAN1 and Periph clocks enable */<br />  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);<br /><br />   /* CAN1 and CAN2 register init */<br />  CAN_DeInit(CAN1);<br />//  CAN_DeInit(CAN2);<br /><br />  /* Struct init*/<br />  CAN_StructInit(&amp;CAN_InitStructure);<br /><br />  /* CAN1 and CAN2  cell init */<br />  CAN_InitStructure.CAN_TTCM = DISABLE;<br />  CAN_InitStructure.CAN_ABOM = DISABLE;<br />  CAN_InitStructure.CAN_AWUM = ENABLE;//DISABLE;<br />  CAN_InitStructure.CAN_NART = DISABLE;<br />  CAN_InitStructure.CAN_RFLM = DISABLE;<br />  CAN_InitStructure.CAN_TXFP = ENABLE;<br />  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;<br />  CAN_InitStructure.CAN_SJW = CAN_SJW_4tq;<br />  CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;<br />  CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;<br /><br />/* 500KBps */<br />  CAN_InitStructure.CAN_Prescaler =12;<br /><br /><br />  /*Initializes the CAN1  and CAN2 */<br />  ststus = CAN_Init(CAN1, &amp;CAN_InitStructure);<br />//  CAN_Init(CAN2, &amp;CAN_InitStructure);<br /><br />  /* CAN1 filter init */<br />  CAN_FilterInitStructure.CAN_FilterNumber = 1;<br />  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;<br />  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;<br />  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x1;<br />  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;<br />  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;<br />  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;<br />  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;<br />  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;<br />  CAN_FilterInit(&amp;CAN_FilterInitStructure);<br /><br />  TxMessage.StdId = 0x10;<br />  TxMessage.ExtId = 0x00;<br />  TxMessage.RTR = CAN_RTR_DATA;<br />  TxMessage.IDE = CAN_ID_STD;<br />  TxMessage.DLC = 4;<br />}[/syntax]<br /><br />w odpowiedzi na wywołanie funkcji <br />[syntax=c]ststus = CAN_Init(CAN1, &amp;CAN_InitStructure);[/syntax]<br />dostaję wartość 1 czyli CAN_InitStatus_Success (konfiguracja przebiegła poprawnie i CAN jest w trybie normal - normalnej pracy) , co potwierdzają rejestry:<br /><a href="https://obrazkiforum.atnel.pl/3824/a23bf4aab73d3de47e6e991b0088dd97.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/a23bf4aab73d3de47e6e991b0088dd97.png" alt="Obrazek" /></a><br /><br />W głównej pętli programu chcę wysyłać ramkę co 1s, zmienna source_time jest to zmienna inkrementowana w przerwaniu od SysTicka i to ją chcę wysyłać po magistrali<br />[syntax=c]while (1)<br />{<br />if(flag_)<br />{<br />TxMessage.Data&#91;0&#93; = (uint8_t)(source_time &gt;&gt; 24);<br />TxMessage.Data&#91;1&#93; = (uint8_t)(source_time &gt;&gt; 16);<br />TxMessage.Data&#91;2&#93; = (uint8_t)(source_time &gt;&gt; 8);<br />TxMessage.Data&#91;3&#93; = (uint8_t)source_time;<br /><br />temp1 = CAN_Transmit(CAN1, &amp;TxMessage);<br /><br />temp2 = CAN_GetLastErrorCode(CAN1);<br /><br />TransmitStatus&#91;0&#93; = CAN_TransmitStatus(CAN1,0);<br />TransmitStatus&#91;1&#93; = CAN_TransmitStatus(CAN1,1);<br />TransmitStatus&#91;2&#93; = CAN_TransmitStatus(CAN1,2);<br />flag_ = 0;<br />}<br />}[/syntax]<br /><br />Rezultatem jest ustawienie się statusu transmisji na (wartość zwraca przez funkcję CAN_TransmitStatus) na pending (ramka oczekuje na wysłanie) dla wszystkich banków FIFO, co potwierdzają rejestry<br /><a href="https://obrazkiforum.atnel.pl/3824/f975cfce8d48375b26dc0fbdfcc4f9ae.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/f975cfce8d48375b26dc0fbdfcc4f9ae.png" alt="Obrazek" /></a><br /><br />Po podłączeniu sond oscyloskopu pomiędzy uP a transceiver, można zaobserwować, że transceiver przepuszcza ramki biegające po CANie -&gt; więc nie jest uszkodzony<br /><a href="https://obrazkiforum.atnel.pl/3824/872e1c899ba32a9e2be8b68da4e9f10c.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3824/872e1c899ba32a9e2be8b68da4e9f10c.png" alt="Obrazek" /></a><br /><br />Reasumując, może ma ktoś pomysł dlaczego STM nie wypuszcza ramki do transcivera tylko jest cały czas w trybie pending?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3824">amilo_pa</a> — 17 lis 2020, o 21:40</p><hr />
]]></content>
</entry>
</feed>