на CANH нет никакой передачи просто уровень 1.2В а CANL уровень 1,6В. нога Rs закорочена на GND. МК stm32f103c8-48pin плату разводил сам.частота передачи 4Кгц. а если эту же прошивку залить в дискавери с мк stm32f103r8 -64pin. передача идет с частотой 17КГц.
Код: Выделить всё
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_can.h>
#include <misc.h>
CanRxMsg RxMessage;
uint8_t CAN_RxRdy;
//CAN_InitStructure.CAN_Prescaler=1; // 2000 kbit/s
//CAN_InitStructure.CAN_Prescaler=2; // 1000 kbit/s
//CAN_InitStructure.CAN_Prescaler=4; // 500 kbit/s
//CAN_InitStructure.CAN_Prescaler=5; // 400 kbit/s
//CAN_InitStructure.CAN_Prescaler=8; // 250 kbit/s
//CAN_InitStructure.CAN_Prescaler=10; // 200 kbit/s
//CAN_InitStructure.CAN_Prescaler=16; // 125 kbit/s
//CAN_InitStructure.CAN_Prescaler=20; // 100 kbit/s
//CAN_InitStructure.CAN_Prescaler=40; // 50 kbit/s
//CAN_InitStructure.CAN_Prescaler=80; // 40 kbit/s
//CAN_InitStructure.CAN_Prescaler=200; // 10 kbit/s
//CAN_InitStructure.CAN_Prescaler=1023; // ganz langsam
void send_to_uart(uint8_t data)
{
while(!(USART1->SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR станет 1
USART1->DR=data; //Отсылаем байт через UART
}
void USB_LP_CAN1_RX0_IRQHandler(void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_FMP0))
{ // message pending ?
CAN_Receive(CAN1,0,&RxMessage); // read the message
// set receive flag
GPIO_SetBits (GPIOB,GPIO_Pin_12);
send_to_uart(RxMessage.StdId);
send_to_uart(RxMessage.ExtId);
send_to_uart(RxMessage.IDE);
send_to_uart(RxMessage.DLC);
send_to_uart(RxMessage.FMI);
send_to_uart(RxMessage.Data[0]);
send_to_uart(RxMessage.Data[1]);
send_to_uart(RxMessage.Data[2]);
send_to_uart(RxMessage.Data[3]);
send_to_uart(RxMessage.Data[4]);
send_to_uart(RxMessage.Data[5]);
send_to_uart(RxMessage.Data[6]);
send_to_uart(RxMessage.Data[7]);
}
}
void can_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure; //Структура содержащая настройки USAR
CAN_FilterInitTypeDef CAN_FilterInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
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);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=ENABLE;
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_Prescaler=20;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;//100kb
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh =0x025<<3;// << 5; //0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0325;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0325;// << 5;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0325;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
send_to_uart(CAN_FilterInitStructure.CAN_FilterIdHigh);
send_to_uart(CAN_FilterInitStructure.CAN_FilterIdLow);
send_to_uart(CAN_FilterInitStructure.CAN_FilterMaskIdHigh);
send_to_uart(CAN_FilterInitStructure.CAN_FilterMaskIdLow);
if(CAN_Init(CAN1, &CAN_InitStructure) != CAN_InitStatus_Failed)
{
GPIO_SetBits (GPIOB,GPIO_Pin_12);
}
}
void inter_can(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable CAN1 RX0 interrupt IRQ channel */
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_EnableIRQ (USB_LP_CAN1_RX0_IRQn);
// Разрешение прерываний от модулей CAN1
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
void inter_usart(void)
{
GPIO_InitTypeDef PORTA_init_struct;
// Включаем тактирование порта А и USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
// Настраиваем ногу TxD (PA9) как выход push-pull c альтернативной функцией
PORTA_init_struct.GPIO_Pin = GPIO_Pin_9;
PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
PORTA_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &PORTA_init_struct);
//Настраиваем UART
USART1->BRR=0x9c4; //BaudRate 9600
USART1->CR1 |= USART_CR1_UE; //Разрешаем работу USART1
USART1->CR1 |= USART_CR1_TE; //Включаем передатчик
//Все остальные параметры (стоп биты, чётность,кол-во байт данных) уже настроены
//как надо, (во все эти биты по умолчанию записаны нули), таким образом мы имеем
// скорость 9600 1 стоп бит, 8 бит данных, без проверки чётности
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CanTxMsg TxMessage;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //Включаем тактирование порта A
//светодиод
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_12; //задаем номер вывода
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //цифровой вход, подтяжка к плюсу
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //включаем подтяжку к «земле»
GPIO_Init (GPIOB,&GPIO_InitStructure); //вызов функции инициализации
inter_usart();
can_init();
inter_can();
uint32_t MailBox;
TxMessage.StdId = 0x07ff;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.Data[0] = 0x01;
TxMessage.Data[1] = 0x02;
TxMessage.Data[2] = 0x03;
TxMessage.Data[3] = 0x04;
TxMessage.Data[4] = 0x05;
TxMessage.Data[5] = 0x06;
TxMessage.Data[6] = 0x07;
TxMessage.Data[7] = 0x08;
CAN_Transmit(CAN1,&TxMessage);
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
}
