15.02.2014, 16:44
|
|
Прохожий
Регистрация: 15.02.2014
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Сообщение от k0der
|
может скинуть кто исходники полностью с инициализацией и отправкой?
|
Писал программу общения с автомобильным CAN - правда, на IARе. Вот код инициализации, отправки сообщения, и реакции на прерывание от приёма ответа). Возможно, здесь найдёте ещё полезную информацию: http://catethysis.ru/index.php/stm32...8%D0%BD%D0%B0/
Код инициализации мной тоже откуда-то взят, но всё работало успешно - принималось, отправлялось. Это был проект моста CAN‹-›USB.
Код:
|
#define CAN1_CLK RCC_APB1Periph_CAN1
#define CAN1_RX_PIN GPIO_Pin_0
#define CAN1_TX_PIN GPIO_Pin_1
#define CAN1_GPIO_PORT GPIOD
#define CAN1_GPIO_CLK RCC_AHB1Periph_GPIOD
#define CAN1_AF_PORT GPIO_AF_CAN1
#define CAN1_RX_SOURCE GPIO_PinSource0
#define CAN1_TX_SOURCE GPIO_PinSource1
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
void CAN1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* CAN GPIOs configuration **************************************************/
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(CAN1_GPIO_CLK, ENABLE);
/* Connect CAN pins to AF9 */
GPIO_PinAFConfig(CAN1_GPIO_PORT, CAN1_RX_SOURCE, CAN1_AF_PORT);
GPIO_PinAFConfig(CAN1_GPIO_PORT, CAN1_TX_SOURCE, CAN1_AF_PORT);
/* Configure CAN RX and TX pins */
GPIO_InitStructure.GPIO_Pin = CAN1_RX_PIN | CAN1_TX_PIN;
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(CAN1_GPIO_PORT, &GPIO_InitStructure);
/* CAN configuration ************************************************** ******/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(CAN1_CLK, ENABLE);
/* CAN register init */
CAN_DeInit(CAN1);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = ENABLE;//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 Baudrate = 125 kBps (CAN clocked at 42 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 12;
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN filter init */
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 = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* Transmit Structure preparation */
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;
/* Enable FIFO 0 message pending Interrupt */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);
}
void CAN1_RX0_IRQHandler (void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_FMP0))
{
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
CanRxMsg msg_buf;
CAN_Receive(CAN1, CAN_FIFO0, &msg_buf);
uint32_t a,b;
a=((((((msg_buf.Data[0]*255+msg_buf.Data[1])*255+msg_buf.Data[2])*255+msg_buf.Data[3])*255+msg_buf.Data[4])*255+msg_buf.Data[5])*255+msg_buf.Data[6])*255+msg_buf.Data[7];
b=a%100000; a=a/100000;
printf("%d%d\r\n",a,b);
}
}
void main()
{
CAN1_Config();
//Формируем сообщение
TxMessage.StdId=134222929;
TxMessage.ExtId=31462954;
TxMessage.Data[0] = 64;
TxMessage.Data[1] = 48;
TxMessage.Data[2] = 0;
TxMessage.Data[3] = 81;
TxMessage.Data[4] = 4;
TxMessage.Data[5] = 0;
TxMessage.Data[6] = 25;
TxMessage.Data[7] = 0;
//Посылаем сообщение
CAN_Transmit(CAN1, &TxMessage);
} |
|
|
|
|
15.02.2014, 21:54
|
|
Прохожий
Регистрация: 24.10.2013
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
у меня лично в нормал моде не завелся. девайс делаю тока для чтения. перевел его в этот режим и принимаю. для отправки использовал режим только отправки
|
|
|
|
04.06.2014, 06:53
|
|
Вид на жительство
Регистрация: 12.04.2007
Сообщений: 348
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 32 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Сообщение от k0der
|
у меня лично в нормал моде не завелся. девайс делаю тока для чтения. перевел его в этот режим и принимаю. для отправки использовал режим только отправки
|
Если на шине нет ни одного устройства, кроме Вашего, то в Normal Mode блок будет висеть в состоянии CAN_TxStatus_Pending.
Для тестирования "на столе" вполне сгодятся Loop mode, Silent mode и их комбинация.
__________________
Гидравлика + электроника = POWER
|
|
|
|
05.06.2014, 07:43
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Catethysis, При твоей инициализации будет отправлен только 1 байт, так как у тебя TxMessage.DLC = 1;
Да и это ни к чему TxMessage.ExtId=31462954; у тебя в инициализации только стандартный ID, и он может быть максимум 0x7FF а у тебя TxMessage.StdId=134222929;
Должно быть наверное вот так!
//Формируем сообщение
TxMessage.StdId=0x7FF; //это максимум для стандартного ID
TxMessage.DLC= 8; // Количество передаваемых байт в сообщении максимум 8
TxMessage.Data[0] = 64;
TxMessage.Data[1] = 48;
TxMessage.Data[2] = 0;
TxMessage.Data[3] = 81;
TxMessage.Data[4] = 4;
TxMessage.Data[5] = 0;
TxMessage.Data[6] = 25;
TxMessage.Data[7] = 0;
|
|
|
|
22.07.2014, 19:43
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Настройка фильтра и маски на прием сообщения со стандартным 11 битным ID 123, для правильной работы необходим сдвиг в лево на 5.
Не могу врубится как занести 29 битный ID? в доке не совсем понятно подскажите кто в курсе?
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0123 ‹‹5;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x07FF ‹‹5;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
|
|
|
|
26.07.2014, 16:47
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Все вопрос решен!
|
|
|
|
26.07.2014, 20:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Сообщение от neyvert
|
в доке не совсем понятно
|
Правда, что на самом деле в доке всё очень даже понятно?
|
|
|
|
26.07.2014, 21:02
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Да спасибо! молчание сподвигло к внимательному изучению! думал мож кто делал так попроще объяснят, но увы! Да еще чуть не забыл в библиотеке не нашел прерывания USB_LP_CAN1_RX0_IRQHandler хотя в доке описано! пришлось в startup_stm32f10x_md_vl.s файл ручками добавлять! это нормально этот файл править?
Последний раз редактировалось neyvert; 26.07.2014 в 21:09.
|
|
|
|
15.12.2015, 11:16
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
В продолжение темы: вы все работаете на внешнем кварце HSE, а подключить и запустить CAN на внутренне HSI возможно?
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
|
15.12.2015, 13:30
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: Кто-нибудь запустил CAN на STM32 ???
Первый раз с CAN сталкиваюсь. Помогите, господа знатоки, что я неправильно сделал в коде. Проц STM32f103c8, тактирую от HSI 24Мгц Fpclk=24MHz Fahb=24MHz, хочу слать данныеные по CAN в цикле.
Какая ситуация:при старте программы TX что то отсылает, затем в цикле ничего не происходит.
void pll_init (void)
{
FLASH-›ACR|= FLASH_ACR_PRFTBE;
FLASH-›ACR&=~FLASH_ACR_LATENCY;
FLASH-›ACR|= FLASH_ACR_LATENCY_1;
//Iano?ieea PLL
RCC-›CFGR &= ~RCC_CFGR_PLLSRC; //Enoi?ieeii neaiaea aey PLL aua?ai HSI n aaeaieai ia 2
RCC-›CR &= ~RCC_CR_PLLON; //Ioee??eou aaia?aoi? PLL
RCC-›CFGR &= ~RCC_CFGR_PLLMULL; //I?enoeou PLLMULL
RCC-›CFGR |= RCC_CFGR_PLLMULL6; //Eiaoeoeaio oiii?aiey = 6
RCC-›CR |= RCC_CR_PLLON; //Aee??eou aaia?aoi? PLL
while((RCC-›CR & RCC_CR_PLLRDY)==0) {} //I?eaaiea aioiaiinoe PLL
//Ia?aee??eouny ia oaeoe?iaaiea io PLL
RCC-›CFGR &= ~RCC_CFGR_SW; //I?enoea aeoia auai?a enoi?ieea oaeoiaiai neaiaea
RCC-›CFGR |= RCC_CFGR_SW_PLL; //Aua?aou enoi?ieeii oaeoiaiai neaiaea PLL
while((RCC-›CFGR&RCC_CFGR_SWS)!=0x08){}//I?eaaiea ia?aee??aiey ia PLL
//Iano?ieou aaeeoaeu aey AHB
RCC-›CFGR &= ~RCC_CFGR_HPRE; //I?enoea aeoia i?aaaaeeoaey "AHB Prescaler"
RCC-›CFGR |= RCC_CFGR_HPRE_DIV1; //Onoaiiaeou "AHB Prescaler" ?aaiui 1
// Fpclk=24MHz Fahb=24MHz
return;
}
int main (void)
{
pll_init ();
pio_config ();
// ?acaeiee?iaaiea oeyoa
NVIC_CAN_Configuration();
CAN_config2();
//_____________________________CAN__________________ ____________
// CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
// CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
// CAN_DBGFreeze(CAN1,DISABLE);
TxMessage.StdId=0x7FF;
TxMessage.DLC= 8;
TxMessage.Data[0] = 64;
TxMessage.Data[1] = 48;
TxMessage.Data[2] = 0;
TxMessage.Data[3] = 81;
TxMessage.Data[4] = 4;
TxMessage.Data[5] = 0;
TxMessage.Data[6] = 25;
TxMessage.Data[7] = 0;
CAN_Transmit(CAN1,&TxMessage);
__enable_irq();
while(1)
{
CAN_Transmit(CAN1,&TxMessage);
pause(500);
}
void NVIC_CAN_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0x0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0x1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void CAN_config2(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//Tx
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //PA2=Tx;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // Alt Function - Push Pull
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Rx
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //PA3=Rx;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* CAN1 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
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_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure.CAN_Prescaler = 24;
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN filter init */
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 = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
__________________
То, что нас не убивает - делает нас сильнее
Последний раз редактировалось serb-radio; 15.12.2015 в 13:35.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:50.
|
|