sn65hvd230 и STM32f103

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Кинг
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн дек 07, 2009 19:29:29

sn65hvd230 и STM32f103

Сообщение Кинг »

неполучается запустить трансивер пакет отправляется 1 раз, на ножках RX, TX, осциллографом видно зацикленную передачу на ноге TX амплитуда 3В, на RX амплитуда 1В.
на 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);
    	
    }
}
Реклама
Аватара пользователя
FantasyDD
Нашел транзистор. Понюхал.
Сообщения: 165
Зарегистрирован: Чт фев 19, 2015 17:26:19
Откуда: СССР

Re: sn65hvd230 и STM32f103

Сообщение FantasyDD »

Кинг писал(а): на RX амплитуда 1В.
коротит RX однако.
Реклама
Ответить

Вернуться в «ARM»