<?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=4&amp;t=21917&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-01-26T23:51:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21917&amp;mode</id>
<entry>
<author><name><![CDATA[Mordziaty]]></name></author>
<updated>2019-01-26T23:51:53+01:00</updated>
<published>2019-01-26T23:51:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21917&amp;p=216118#p216118</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21917&amp;p=216118#p216118"/>
<title type="html"><![CDATA[CAN bus pomiędzy dwoma STM32F103C8T6]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21917&amp;p=216118#p216118"><![CDATA[
Dobry wieczór, chcę skonfigurować połączenie CAN pomiędzy dwoma bluepillami z stm32f103c8t6, tranceivery jakich używam to SN65HVD230. Chce przesyłać dane z jednego stma do drugiego i na podstawie tego że otrzymał taką i taką ramkę drugi stm miałby zaświecić diodę. Większość ludzi zaleca korzystanie z bibliotek HAL, ja chciałbym to zrobić bez tego i dodatkowo po próbie wygenerowania kodu i wgrania pliku .hex przez stlinka muszę czyścić flash stma bo nawet nie łączy się z programatorem. Czy konfiguracja CAN niżej jest poprawna? Jak mógłbym zrealizować te warunki na świecenie diody?<br /><br />[syntax=c]#include &quot;stm32f10x.h&quot;<br />#include &quot;misc.h&quot;<br />#include &quot;stm32f10x_can.h&quot;<br />#include &quot;stm32f10x_rcc.h&quot;<br />#include &quot;stm32f10x_gpio.h&quot;<br /><br />int i;<br />CanTxMsg TxMessage;<br />CanRxMsg rx_message;<br />uint8_t TransmitMailbox = 0;<br /><br /><br />void USB_LP_CAN1_RX0_IRQHandler(){<br />CAN_Receive(CAN1, CAN_FIFO0, &amp;rx_message);<br /><br />}<br /><br />void NVIC_Configuration(void)<br />{<br />    NVIC_InitTypeDef NVIC_InitStructure;<br />    /* Enable CAN1 RX0 interrupt IRQ channel */<br />    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;//przerwania pochodzace od RX0 w CAN1 czyli odebranie danych.<br />    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //priorytet grupowy 0<br />    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//subpriorytet 0<br />    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//wlaczenie obslugi przerwan<br />    NVIC_Init(&amp;NVIC_InitStructure);<br /><br />}<br /><br />void CAN_Configuration(void)<br />{<br />CAN_InitTypeDef CAN_InitStructure;<br />CAN_FilterInitTypeDef CAN_FilterInitStructure;<br />/* CAN register init */<br />    CAN_DeInit(CAN1);<br />    CAN_StructInit(&amp;CAN_InitStructure);<br /><br />    /* CAN cell init */<br />    CAN_InitStructure.CAN_TTCM = DISABLE;//komunikacja wyzwalana czasowo<br />    CAN_InitStructure.CAN_ABOM = DISABLE;//automatyczne zarządzanie odcinaniem od sieci<br />    CAN_InitStructure.CAN_AWUM = DISABLE;//tryb automatycznego wybudzania<br />    CAN_InitStructure.CAN_NART = DISABLE;   //tryb automatycznej retransmisji<br />    CAN_InitStructure.CAN_RFLM = DISABLE;//tryb zabezpieczenia przed nadpisaniem danych przechowywanych w kolejkach FIFO przez nowe dane<br />    CAN_InitStructure.CAN_TXFP = DISABLE;//priorytey kolejek FIFO dla danych wysyłanych<br />    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;<br />    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;// (1-4) Time quanta difference for resynchronization<br />    CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq;//czas bs1 może wynosic od 1 do 16 wielokrotności kwantu czasu<br />    CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;//bs2 może trwac max 8 kwantow czasu<br />    CAN_InitStructure.CAN_Prescaler = 21;// prescaler-dzielnik czestotliwosci<br />    CAN_Init(CAN1, &amp;CAN_InitStructure);<br /><br /><br />    CAN_FilterInitStructure.CAN_FilterNumber=0;<br />    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;<br />    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;<br />    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;<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 /><br />int main(void)<br />{<br />    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);       //wlaczenie taktowania CAN1<br />    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<br />    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //wlaczenie taktowania portu A<br /><br />    GPIO_InitTypeDef GPIO_InitStructure;<br />    /* Configure CAN pin: RX */<br />    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;<br />    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;<br />    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />    GPIO_Init(GPIOB, &amp;GPIO_InitStructure);<br /><br />    /* Configure CAN pin: TX */<br />    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;<br />    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />    GPIO_Init(GPIOB, &amp;GPIO_InitStructure);<br /><br />    GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);<br />    NVIC_Configuration();<br />    CAN_Configuration();<br /><br />    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);<br />    while(1)<br />    {<br /><br />       //wysylana wiadomosc<br />        TxMessage.StdId = 0x00;<br />        TxMessage.ExtId = 0x00;<br />        TxMessage.StdId = 0x11;//Standard identyfi<br />        TxMessage.RTR = CAN_RTR_DATA;//rodzaj ramki: ramka danych<br />        TxMessage.IDE = CAN_ID_STD;//format ramki danych: normalna<br />        TxMessage.DLC = 4;//Liczba wykorzystanych bajtow danych<br />        TxMessage.Data&#91;0&#93; = 0xFF;<br />        TxMessage.Data&#91;1&#93; = 0xFF;<br />        TxMessage.Data&#91;2&#93; = 0xFF;<br />        TxMessage.Data&#91;3&#93; = 0xFF;<br /><br />        //Wyslanie wiadomosci<br />        TransmitMailbox = CAN_Transmit(CAN1, &amp;TxMessage);<br />        i = 0;<br />        while ((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK)&amp;&amp;(i != 0xFF))<br />        {<br />            i++;<br />        }<br /><br />    }<br />}<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />typedef struct<br />{<br />    uint32_t StdId;<br />    uint32_t ExtId;<br />    uint8_t IDE;<br />    uint8_t RTR;<br />    uint8_t DLC;<br />    uint8_t Data&#91;8&#93;;<br />} CanTx2Msg;<br /><br />typedef struct<br />{<br />    uint32_t StdId;<br />    uint32_t ExtId;<br />    uint8_t IDE;<br />    uint8_t RTR;<br />    uint8_t DLC;<br />    uint8_t Data&#91;8&#93;;<br />    uint8_t FMI;<br />} CanRx2Msg;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20472">Mordziaty</a> — 26 sty 2019, o 23:51</p><hr />
]]></content>
</entry>
</feed>