Страницы

Страницы

суббота, 9 апреля 2016 г.

bxCAN STM32F042 transmit and receive.

Transmitter

#include "stm32f0xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef hcan;

I2C_HandleTypeDef hi2c1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

unsigned int val_Tx = 0, val_Rx = 0;              /* Globals used for display */
volatile uint32_t msTicks;                        /* counts 1ms timeTicks     */




uint8_t xBuffer[3],rrr,www,send;
uint8_t UART_Buffer[3]={0x31,0x32,0x0D};
uint8_t DEVADDR;
uint32_t CAN_ReceiveMessage = 0;

typedef struct  {
  unsigned int   id;                    /* 29 bit identifier */
  unsigned char  data[8];               /* Data field */
  unsigned char  len;                   /* Length of data field in bytes */
  unsigned char  format;                /* 0 - STANDARD, 1- EXTENDED IDENTIFIER */
  unsigned char  type;                  /* 0 - DATA FRAME, 1 - REMOTE FRAME */
} CAN_msg;

CAN_msg       CAN_RxMsg;                      /* CAN message for receiving */                              
CAN_msg       CAN_TxMsg[2];                      /* CAN message for sending */


uint32_t      CAN_RxRdy = 0;              /* CAN HW received a message */
uint32_t      CAN_TxRdy = 0;              /* CAN HW transmit a message */

static uint32_t CAN_filterIdx[2] = {0,0};        /* static variable for the filter index */

uint32_t      CAN_msgId     = 0;

#define STANDARD_FORMAT  0
#define EXTENDED_FORMAT  1

#define DATA_FRAME       0
#define REMOTE_FRAME     1
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
static void MX_I2C1_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
//==============================================================================
void CAN_wrFilter (uint32_t ctrl, uint32_t id, uint8_t format)  {

  if (CAN_filterIdx[ctrl-1] > 13) {                 /* check if Filter Memory is full*/
    return;
  }
                                            /* Setup identifier information  */
  if (format == STANDARD_FORMAT)  {         /*   Standard ID                 */
      CAN_msgId |= (uint32_t)(id << 21) | CAN_ID_STD;
  }  else  {                                /*   Extended ID                 */
      CAN_msgId |= (uint32_t)(id <<  3) | CAN_ID_EXT;
  }

  CAN->FMR  |=   CAN_FMR_FINIT;            /* set initMode for filter banks */
  CAN->FA1R &=  ~(1UL << CAN_filterIdx[ctrl-1]);   /* deactivate filter             */

                                            /* initialize filter             */
  CAN->FS1R |= (uint32_t)(1 << CAN_filterIdx[ctrl-1]);     /* set 32-bit scale configuration    */

/*! !* To disable the CAN Filters: Swap the comment on the next two lines and the two lines after the next line. */
CAN->FM1R |= (uint32_t)(1 << CAN_filterIdx[ctrl-1]);   /* set to 32-bit Identifier List mode */
//CAN->FM1R |= 0x0;     /* DISABLES FILTERS  set to 32-bit Identifier Mask mode */

  CAN->sFilterRegister[CAN_filterIdx[ctrl-1]].FR1 = 0; //CAN_msgId; /*  32-bit identifier   */

/* !!*  To disable the CAN Filters: Swap the comment on the next two lines.    */
  CAN->sFilterRegister[CAN_filterIdx[ctrl-1]].FR2 = CAN_msgId; /*  32-bit identifier (33) for identifier mode  */
//CAN->sFilterRegister[CAN_filterIdx[ctrl-1]].FR2 = 0; /*  DISABLES FILTERS  32-bit MASK for mask mode */
 
 
  CAN->FFA1R &= ~(uint32_t)(1 << CAN_filterIdx[ctrl-1]);   /* assign filter to FIFO 0  */
  CAN->FA1R  |=  (uint32_t)(1 << CAN_filterIdx[ctrl-1]);   /* activate filter          */

  CAN->FMR &= ~CAN_FMR_FINIT;              /* reset initMode for filterBanks*/

CAN_filterIdx[ctrl-1]++;                       /* increase filter index  */
}

//===========================================================================================


void CAN_wrMsg (uint32_t ctrl, CAN_msg *msg)  {
//  CAN_TypeDef *pCAN = (ctrl == 1) ? CAN1 : CAN2;

  CAN->sTxMailBox[0].TIR  = (uint32_t)0; /* reset TXRQ bit */
                                          /* Setup identifier information */
  if (msg->format == STANDARD_FORMAT) {   /*    Standard ID                   */
    CAN->sTxMailBox[0].TIR |= (uint32_t)(msg->id << 21) | CAN_ID_STD;
  } else {                                /* Extended ID                      */
    CAN->sTxMailBox[0].TIR |= (uint32_t)(msg->id <<  3) | CAN_ID_EXT;
  }

                                          /* Setup type information           */
  if (msg->type == DATA_FRAME)  {         /* DATA FRAME                       */
    CAN->sTxMailBox[0].TIR |= CAN_RTR_DATA;
  } else {                                /* REMOTE FRAME                     */
    CAN->sTxMailBox[0].TIR |= CAN_RTR_REMOTE;
  }
                                          /* Setup data bytes                 */
  CAN->sTxMailBox[0].TDLR = (((uint32_t)msg->data[3] << 24) |
                              ((uint32_t)msg->data[2] << 16) |
                              ((uint32_t)msg->data[1] <<  8) |
                              ((uint32_t)msg->data[0])        );
  CAN->sTxMailBox[0].TDHR = (((uint32_t)msg->data[7] << 24) |
                              ((uint32_t)msg->data[6] << 16) |
                              ((uint32_t)msg->data[5] <<  8) |
                              ((uint32_t)msg->data[4])        );
                                          /* Setup length                     */
  CAN->sTxMailBox[0].TDTR &= ~CAN_TDT0R_DLC;
  CAN->sTxMailBox[0].TDTR |=  (msg->len & CAN_TDT0R_DLC);

  CAN->IER |= CAN_IER_TMEIE;                 /* enable  TME interrupt        */
  CAN->sTxMailBox[0].TIR |=  CAN_TI0R_TXRQ;  /* transmit message             */
}

//============================================================================================
void CAN_rdMsg (uint32_t ctrl, CAN_msg *msg)  {
                                              /* Read identifier information  */
  if ((CAN->sFIFOMailBox[0].RIR & CAN_ID_EXT) == 0) {
    msg->format = STANDARD_FORMAT;
    msg->id     = 0x000007FF & (CAN->sFIFOMailBox[0].RIR >> 21);
  } else {
    msg->format = EXTENDED_FORMAT;
    msg->id     = 0x1FFFFFFF & (CAN->sFIFOMailBox[0].RIR >> 3);
  }
                                              /* Read type information        */
  if ((CAN->sFIFOMailBox[0].RIR & CAN_RTR_REMOTE) == 0) {
    msg->type =   DATA_FRAME;
  } else {
    msg->type = REMOTE_FRAME;
  }
                                              /* Read number of rec. bytes    */
  msg->len     = (CAN->sFIFOMailBox[0].RDTR      ) & 0x0F;
                                              /* Read data bytes              */
  msg->data[0] = (CAN->sFIFOMailBox[0].RDLR      ) & 0xFF;
  msg->data[1] = (CAN->sFIFOMailBox[0].RDLR >>  8) & 0xFF;
  msg->data[2] = (CAN->sFIFOMailBox[0].RDLR >> 16) & 0xFF;
  msg->data[3] = (CAN->sFIFOMailBox[0].RDLR >> 24) & 0xFF;

  msg->data[4] = (CAN->sFIFOMailBox[0].RDHR      ) & 0xFF;
  msg->data[5] = (CAN->sFIFOMailBox[0].RDHR >>  8) & 0xFF;
  msg->data[6] = (CAN->sFIFOMailBox[0].RDHR >> 16) & 0xFF;
  msg->data[7] = (CAN->sFIFOMailBox[0].RDHR >> 24) & 0xFF;

  CAN->RF0R |= CAN_RF0R_RFOM0;             /* Release FIFO 0 output mailbox */
}
//=============================================================================
void read_CAN(void)
{
CAN_rdMsg (1, &CAN_RxMsg);
}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  MX_I2C1_Init();

  /* USER CODE BEGIN 2 */
 CAN->IER |= CAN_IER_FMPIE0; /* enable FIFO 0 msg pending IRQ    */

 CAN->IER |= CAN_IER_TMEIE; /* enable FIFO 0 msg pending IRQ    */

 CAN_wrFilter (1, 199, STANDARD_FORMAT);    /* filter reception of msgs */                          
 CAN->MCR &= ~CAN_MCR_INRQ;             /* normal operating mode, reset INRQ*/
 while (CAN->MSR & CAN_MCR_INRQ); /* start CAN Controller  */                    

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); //on Power LED
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //off CAN LED


  int i;
  //LED_Init ();                                    /* initialize the LEDs      */
  SystemCoreClockUpdate();                        /* Get Core Clock Frequency */

  SysTick_Config(SystemCoreClock /1000);         /* SysTick 1 msec irq       */

  CAN_TxMsg[1].id = 199;                           /* initialize msg to send   */
  for (i = 0; i < 8; i++) CAN_TxMsg[0].data[i] = 0;
  CAN_TxMsg[1].len = 1;
  CAN_TxMsg[1].format = STANDARD_FORMAT;
CAN_TxMsg[1].type = DATA_FRAME;

      CAN_TxRdy = 1;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

//    if (CAN_RxRdy == 1)   /* rx msg on CAN Ctrl */
// {                        
// CAN_RxRdy = 0; //clear CAM flag
// xBuffer[1] = 0; //write command
// xBuffer[0] = 0x12; //data for write command
//// xBuffer[0] = CAN_ReceiveMessage;
// DEVADDR=0x5e; //asdress of digital potentiometr
// www=HAL_I2C_Master_Transmit(&hi2c1, (uint16_t) DEVADDR, xBuffer, 2, 10);  //write to address  (2-number of bytes)
//        HAL_Delay(1); //memory write delay
// HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2); //toggle CAN LED
// }


    val_Tx = val_Tx + 1;
    if (CAN_TxRdy) {                           /* tx msg on CAN Ctrl #2    */
      CAN_TxRdy = 0;
      CAN_TxMsg[1].data[0] = val_Tx;              /* data[0] = ADC value      */
for (i = 1; i < 8; i++) CAN_TxMsg[1].data[i] = val_Tx;
      CAN_wrMsg (2, &CAN_TxMsg[1]);               /* transmit message         */

// void CAN_wrMsg (uint32_t ctrl, CAN_msg *msg)  {
//  CAN_TypeDef *pCAN = (ctrl == 1) ? CAN1 : CAN2;

  CAN->sTxMailBox[0].TIR  = (uint32_t)0; /* reset TXRQ bit */
                                          /* Setup identifier information */
  if (CAN_TxMsg->format == STANDARD_FORMAT) {   /*    Standard ID                   */
    CAN->sTxMailBox[0].TIR |= (uint32_t)(CAN_TxMsg->id << 21) | CAN_ID_STD;
  } else {                                /* Extended ID                      */
    CAN->sTxMailBox[0].TIR |= (uint32_t)(CAN_TxMsg->id <<  3) | CAN_ID_EXT;
  }

                                          /* Setup type information           */
  if (CAN_TxMsg->type == DATA_FRAME)  {         /* DATA FRAME                       */
    CAN->sTxMailBox[0].TIR |= CAN_RTR_DATA;
  } else {                                /* REMOTE FRAME                     */
    CAN->sTxMailBox[0].TIR |= CAN_RTR_REMOTE;
  }
                                          /* Setup data bytes                 */
  CAN->sTxMailBox[0].TDLR = (((uint32_t)CAN_TxMsg->data[3] << 24) |
                              ((uint32_t)CAN_TxMsg->data[2] << 16) |
                              ((uint32_t)CAN_TxMsg->data[1] <<  8) |
                              ((uint32_t)CAN_TxMsg->data[0])        );
  CAN->sTxMailBox[0].TDHR = (((uint32_t)CAN_TxMsg->data[7] << 24) |
                              ((uint32_t)CAN_TxMsg->data[6] << 16) |
                              ((uint32_t)CAN_TxMsg->data[5] <<  8) |
                              ((uint32_t)CAN_TxMsg->data[4])        );
                                          /* Setup length                     */
  CAN->sTxMailBox[0].TDTR &= ~CAN_TDT0R_DLC;
  CAN->sTxMailBox[0].TDTR |=  (CAN_TxMsg->len & CAN_TDT0R_DLC);

  CAN->IER |= CAN_IER_TMEIE;                 /* enable  TME interrupt        */
  CAN->sTxMailBox[0].TIR |=  CAN_TI0R_TXRQ;  /* transmit message             */
//}


//HAL_CAN_Transmit_IT(&hcan2);

    }
    HAL_Delay (10);                                   /* delay for 10ms           */
    if (CAN_RxRdy) {                           /* rx msg on CAN Ctrl #1    */
      CAN_RxRdy = 0;
      val_Rx = CAN_RxMsg.data[0];
    }
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2); //toggle CAN LED

    HAL_Delay (200);                                  /* delay for 500ms          */



  }
  /* USER CODE END 3 */

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/**
  ******************************************************************************
  * @file    stm32f0xx_it.c
  * @brief   Interrupt Service Routines.
  ******************************************************************************
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
#include "stm32f0xx.h"
#include "stm32f0xx_it.h"

/* USER CODE BEGIN 0 */
extern void read_CAN (void);
extern uint32_t CAN_ReceiveMessage;
extern uint32_t CAN_RxRdy;
extern uint32_t CAN_TxRdy;
/* USER CODE END 0 */

/* External variables --------------------------------------------------------*/
extern CAN_HandleTypeDef hcan;
extern I2C_HandleTypeDef hi2c1;

/******************************************************************************/
/*            Cortex-M0 Processor Interruption and Exception Handlers         */ 
/******************************************************************************/

/**
* @brief This function handles Non maskable interrupt.
*/
void NMI_Handler(void)
{
  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */

  /* USER CODE END NonMaskableInt_IRQn 0 */
  
  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */

  /* USER CODE END NonMaskableInt_IRQn 1 */
}

/**
* @brief This function handles Hard fault interrupt.
*/
void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
  }
  /* USER CODE BEGIN HardFault_IRQn 1 */

  /* USER CODE END HardFault_IRQn 1 */
}

/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

/******************************************************************************/
/* STM32F0xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f0xx.s).                    */
/******************************************************************************/

/**
* @brief This function handles I2C1 event global interrupt / I2C1 wake-up interrupt through EXTI line 23.
*/
void I2C1_IRQHandler(void)
{
  /* USER CODE BEGIN I2C1_IRQn 0 */

  /* USER CODE END I2C1_IRQn 0 */
  if (hi2c1.Instance->ISR & (I2C_FLAG_BERR | I2C_FLAG_ARLO | I2C_FLAG_OVR)) {
    HAL_I2C_ER_IRQHandler(&hi2c1);
  } else {
    HAL_I2C_EV_IRQHandler(&hi2c1);
  }
  /* USER CODE BEGIN I2C1_IRQn 1 */

  /* USER CODE END I2C1_IRQn 1 */
}

/**
* @brief This function handles HDMI-CEC and CAN global interrupts / HDMI-CEC wake-up interrupt through EXTI line 27.
*/
void CEC_CAN_IRQHandler(void)
{
  /* USER CODE BEGIN CEC_CAN_IRQn 0 */
  if (CAN->RF0R & CAN_RF0R_FMP0) {     /* message pending ?              */
 read_CAN ();           /* read the message               */
    CAN_RxRdy = 1;                       /*  set receive flag              */
CAN_ReceiveMessage = CAN->sFIFOMailBox[0].RDLR; /* read data */
    CAN->RF0R |= CAN_RF0R_RFOM0; /* release FIFO */
  }
  if (CAN->TSR & CAN_TSR_RQCP0) {          /* request completed mbx 0        */
    CAN->TSR |= CAN_TSR_RQCP0;             /* reset request complete mbx 0   */
    CAN->IER &= ~CAN_IER_TMEIE;            /* disable  TME interrupt         */

 CAN_TxRdy = 1; 
  }

  /* USER CODE END CEC_CAN_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan);
  /* USER CODE BEGIN CEC_CAN_IRQn 1 */

  /* USER CODE END CEC_CAN_IRQn 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/



Receiver

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef hcan;

I2C_HandleTypeDef hi2c1;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t xBuffer[3],rrr,www1,www2,send;
uint8_t UART_Buffer[3]={0x31,0x32,0x0D};
uint8_t DEVADDR;

uint32_t CAN_ReceiveMessage1 = 0;
uint32_t CAN_ReceiveMessage2 = 0;

typedef struct  {
  unsigned int   id;                    /* 29 bit identifier */
  unsigned char  data[8];               /* Data field */
  unsigned char  len;                   /* Length of data field in bytes */
  unsigned char  format;                /* 0 - STANDARD, 1- EXTENDED IDENTIFIER */
  unsigned char  type;                  /* 0 - DATA FRAME, 1 - REMOTE FRAME */
} CAN_msg;

CAN_msg       CAN_RxMsg;                      /* CAN message for receiving */                                

uint32_t      CAN_RxRdy = 0;              /* CAN HW received a message */

static uint32_t CAN_filterIdx[2] = {0,0};        /* static variable for the filter index */

uint32_t      CAN_msgId     = 0;

#define STANDARD_FORMAT  0
#define EXTENDED_FORMAT  1

#define DATA_FRAME       0
#define REMOTE_FRAME     1
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
static void MX_I2C1_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
//==============================================================================
void CAN_wrFilter (uint32_t ctrl, uint32_t id, uint8_t format)  {
  
  if (CAN_filterIdx[ctrl-1] > 13) {                 /* check if Filter Memory is full*/
    return;
  }
                                            /* Setup identifier information  */
  if (format == STANDARD_FORMAT)  {         /*   Standard ID                 */
      CAN_msgId |= (uint32_t)(id << 21) | CAN_ID_STD;
  }  else  {                                /*   Extended ID                 */
      CAN_msgId |= (uint32_t)(id <<  3) | CAN_ID_EXT;
  }

  CAN->FMR  |=   CAN_FMR_FINIT;            /* set initMode for filter banks */
  CAN->FA1R &=  ~(1UL << CAN_filterIdx[ctrl-1]);   /* deactivate filter             */

                                            /* initialize filter             */
  CAN->FS1R |= (uint32_t)(1 << CAN_filterIdx[ctrl-1]);     /* set 32-bit scale configuration    */
/*! !* To disable the CAN Filters: Swap the comment on the next two lines and the two lines after the next line. */
CAN->FM1R |= (uint32_t)(1 << CAN_filterIdx[ctrl-1]);   /* set to 32-bit Identifier List mode */
//CAN->FM1R |= 0x0;     /* DISABLES FILTERS  set to 32-bit Identifier Mask mode */
  CAN->sFilterRegister[CAN_filterIdx[ctrl-1]].FR1 = 0; //CAN_msgId; /*  32-bit identifier   */
/* !!*  To disable the CAN Filters: Swap the comment on the next two lines.    */
  CAN->sFilterRegister[CAN_filterIdx[ctrl-1]].FR2 = CAN_msgId; /*  32-bit identifier (33) for identifier mode  */
//CAN->sFilterRegister[CAN_filterIdx[ctrl-1]].FR2 = 0; /*  DISABLES FILTERS  32-bit MASK for mask mode */
   
   
  CAN->FFA1R &= ~(uint32_t)(1 << CAN_filterIdx[ctrl-1]);   /* assign filter to FIFO 0  */
  CAN->FA1R  |=  (uint32_t)(1 << CAN_filterIdx[ctrl-1]);   /* activate filter          */
  CAN->FMR &= ~CAN_FMR_FINIT;              /* reset initMode for filterBanks*/
CAN_filterIdx[ctrl-1]++;                       /* increase filter index  */
}

//===========================================================================================
void CAN_rdMsg (uint32_t ctrl, CAN_msg *msg)  {
                                              /* Read identifier information  */
  if ((CAN->sFIFOMailBox[0].RIR & CAN_ID_EXT) == 0) {
    msg->format = STANDARD_FORMAT;
    msg->id     = 0x000007FF & (CAN->sFIFOMailBox[0].RIR >> 21);
  } else {
    msg->format = EXTENDED_FORMAT;
    msg->id     = 0x1FFFFFFF & (CAN->sFIFOMailBox[0].RIR >> 3);
  }
                                              /* Read type information        */
  if ((CAN->sFIFOMailBox[0].RIR & CAN_RTR_REMOTE) == 0) {
    msg->type =   DATA_FRAME;
  } else {
    msg->type = REMOTE_FRAME;
  }
                                              /* Read number of rec. bytes    */
  msg->len     = (CAN->sFIFOMailBox[0].RDTR      ) & 0x0F;
                                              /* Read data bytes              */
  msg->data[0] = (CAN->sFIFOMailBox[0].RDLR      ) & 0xFF;
  msg->data[1] = (CAN->sFIFOMailBox[0].RDLR >>  8) & 0xFF;
  msg->data[2] = (CAN->sFIFOMailBox[0].RDLR >> 16) & 0xFF;
  msg->data[3] = (CAN->sFIFOMailBox[0].RDLR >> 24) & 0xFF;

  msg->data[4] = (CAN->sFIFOMailBox[0].RDHR      ) & 0xFF;
  msg->data[5] = (CAN->sFIFOMailBox[0].RDHR >>  8) & 0xFF;
  msg->data[6] = (CAN->sFIFOMailBox[0].RDHR >> 16) & 0xFF;
  msg->data[7] = (CAN->sFIFOMailBox[0].RDHR >> 24) & 0xFF;

  CAN->RF0R |= CAN_RF0R_RFOM0;             /* Release FIFO 0 output mailbox */
}
//=============================================================================
void read_CAN(void)
{
CAN_rdMsg (1, &CAN_RxMsg);
}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  MX_I2C1_Init();

  /* USER CODE BEGIN 2 */
 CAN->IER |= CAN_IER_FMPIE0; /* enable FIFO 0 msg pending IRQ    */ 
 CAN_wrFilter (1, 199, STANDARD_FORMAT);    /* filter reception of msgs */                            
 CAN->MCR &= ~CAN_MCR_INRQ;             /* normal operating mode, reset INRQ*/
 while (CAN->MSR & CAN_MCR_INRQ); /* start CAN Controller  */                       

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); //on Power LED
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); //off CAN LED

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    if (CAN_RxRdy == 1)   // rx msg on CAN Ctrl 
{                          
CAN_RxRdy = 0; //clear CAM flag

xBuffer[0] = 0x0; //write byte to potentiometr 0
xBuffer[1] = CAN_ReceiveMessage1;
DEVADDR=0x50; //asdress of digital potentiometr
www1=HAL_I2C_Master_Transmit(&hi2c1, (uint16_t) DEVADDR, xBuffer, 2, 10);   //write to address  (2-number of bytes)      
//!!!       www1 = 0 if Transmit OK
xBuffer[0] = 0x10; //write byte to potentiometr 1
xBuffer[1] = CAN_ReceiveMessage2;
DEVADDR=0x50; //asdress of digital potentiometr
www2=HAL_I2C_Master_Transmit(&hi2c1, (uint16_t) DEVADDR, xBuffer, 2, 10);   //write to address  (2-number of bytes)
//!!!        www2 = 0 if Transmit OK
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3); //toggle CAN LED
}
//==========================================================================================================================
// TEST for digi pot
//==========================================================================================================================
//for (rrr=0;rrr<=255;rrr++)
//{
// xBuffer[0] = 0x0; //write byte to potentiometr 0
// xBuffer[1] = rrr;
// DEVADDR=0x5e; //asdress of digital potentiometr
// www1=HAL_I2C_Master_Transmit(&hi2c1, (uint16_t) DEVADDR, xBuffer, 2, 10);  //write to address  (2-number of bytes) //memory write delay
// xBuffer[0] = 0x10; //write byte to potentiometr 1
// xBuffer[1] = rrr;
// DEVADDR=0x5e; //asdress of digital potentiometr
// www2=HAL_I2C_Master_Transmit(&hi2c1, (uint16_t) DEVADDR, xBuffer, 2, 10);  //write to address  (2-number of bytes)
//HAL_Delay(200);  //delay for debug
//}
//===========================================================================================================================
  }
  /* USER CODE END 3 */

}


/**
  ******************************************************************************
  * @file    stm32f0xx_it.c
  * @brief   Interrupt Service Routines.
  ******************************************************************************
  
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
#include "stm32f0xx.h"
#include "stm32f0xx_it.h"

/* USER CODE BEGIN 0 */
extern void read_CAN (void);
extern uint32_t CAN_ReceiveMessage1, CAN_ReceiveMessage2;
extern uint32_t CAN_RxRdy;
/* USER CODE END 0 */

/* External variables --------------------------------------------------------*/
extern CAN_HandleTypeDef hcan;
extern I2C_HandleTypeDef hi2c1;

/******************************************************************************/
/*            Cortex-M0 Processor Interruption and Exception Handlers         */ 
/******************************************************************************/

/**
* @brief This function handles Non maskable interrupt.
*/
void NMI_Handler(void)
{
  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */

  /* USER CODE END NonMaskableInt_IRQn 0 */
  
  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */

  /* USER CODE END NonMaskableInt_IRQn 1 */
}

/**
* @brief This function handles Hard fault interrupt.
*/
void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
  }
  /* USER CODE BEGIN HardFault_IRQn 1 */

  /* USER CODE END HardFault_IRQn 1 */
}

/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

/******************************************************************************/
/* STM32F0xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f0xx.s).                    */
/******************************************************************************/

/**
* @brief This function handles I2C1 event global interrupt / I2C1 wake-up interrupt through EXTI line 23.
*/
void I2C1_IRQHandler(void)
{
  /* USER CODE BEGIN I2C1_IRQn 0 */

  /* USER CODE END I2C1_IRQn 0 */
  if (hi2c1.Instance->ISR & (I2C_FLAG_BERR | I2C_FLAG_ARLO | I2C_FLAG_OVR)) {
    HAL_I2C_ER_IRQHandler(&hi2c1);
  } else {
    HAL_I2C_EV_IRQHandler(&hi2c1);
  }
  /* USER CODE BEGIN I2C1_IRQn 1 */

  /* USER CODE END I2C1_IRQn 1 */
}

/**
* @brief This function handles HDMI-CEC and CAN global interrupts / HDMI-CEC wake-up interrupt through EXTI line 27.
*/
void CEC_CAN_IRQHandler(void)
{
  /* USER CODE BEGIN CEC_CAN_IRQn 0 */
  if (CAN->RF0R & CAN_RF0R_FMP0) {     /* message pending ?              */
 read_CAN ();           /* read the message               */
    CAN_RxRdy = 1;                       /*  set receive flag              */
CAN_ReceiveMessage1 = CAN->sFIFOMailBox[0].RDLR; /* read data */
CAN_ReceiveMessage2 = CAN->sFIFOMailBox[0].RDLR >> 8; /* read data */
    CAN->RF0R |= CAN_RF0R_RFOM0; /* release FIFO */
  }

  /* USER CODE END CEC_CAN_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan);
  /* USER CODE BEGIN CEC_CAN_IRQn 1 */

  /* USER CODE END CEC_CAN_IRQn 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


Комментариев нет:

Отправить комментарий