60-CAN_MCP25050-Library (STM32F4)

mit dieser Library kann der 8-Kanal CAN-Portexpander von Microchip (MCP25050) am STM32F4 über den CAN-Bus betrieben werden.

Den MCP25050 gibt es bei Reichelt zu kaufen (ca. 3 EUR) , allerdings muss dieser einmalig mit einem HEX-File programmiert werden (das ist im Projekt dabei). Dazu ist ein passendes Programiergerät (z.B. Galep-5) notwendig. (gegen einen Unkostenbeitrag kann ich das programmieren übernehmen)

Die 8 GPIO-Pins können in verschiedenen Modes betrieben werden :
Digital-In (GP-0 bis GP-7)
Digital-Out (GP-0 bis GP-6)
Analog-In (GP-0 bis GP-3)
PWM-Out (GP-2 bis GP-3)

Bilder :

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO
Benutzte Librarys : STM32_UB_CAN1

Enumerationen der GPIOs :

1
2
3
4
5
6
7
8
9
10
typedef enum {
  MCP_GP0 = 0, // Pin1  (GPIO0, AN0)
  MCP_GP1,     // Pin2  (GPIO1, AN1)
  MCP_GP2,     // Pin3  (GPIO2, AN2, PWM1)
  MCP_GP3,     // Pin4  (GPIO3, AN3, PWM2)
  MCP_GP4,     // Pin5  (GPIO4)
  MCP_GP5,     // Pin6  (GPIO5)
  MCP_GP6,     // Pin10 (GPIO6)
  MCP_GP7      // Pin11 (GPI7) 
}MCP_GPIO_t;

Enumerationen der Modes :

1
2
3
4
5
6
typedef enum {
  MCP_GPIO_OUT = 0,  // Pin als Digital-Ausgang
  MCP_GPIO_IN,       // Pin als Digital-Eingang
  MCP_PWM_OUT,       // Pin als PWM-Ausgang
  MCP_ADC_IN         // Pin als Analog-Eingang
}MCP_PIN_MODE_t;

Funktionen :

1
2
3
4
5
6
7
8
9
10
ErrorStatus UB_MCP25050_Init(void);                                       // zum init vom MCP25050
ErrorStatus UB_MCP25050_Check(void);                                      // zum testen ob der IC am CAN-Bus hängt
void UB_MCP25050_PIN_Define(MCP_GPIO_t pin, MCP_PIN_MODE_t mode);         // um den Mode eines Port-Pin zu definieren
void UB_MCP25050_GPIO_Lo(MCP_GPIO_t pin);                                 // um einen Digital-Pin auf Lo zu setzen
void UB_MCP25050_GPIO_Hi(MCP_GPIO_t pin);                                 // um einen Digital-Pin auf Hi zu setzen
BitAction UB_MCP25050_GPIO_Read(MCP_GPIO_t pin);                          // um einen Digital-Pin auszulesen
uint16_t UB_MCP25050_ADC_Read(MCP_GPIO_t pin);                            // um einen ADC-Wert auszulesen
void UB_MCP25050_PWM_Enable(MCP_GPIO_t pin, uint8_t pwm_speed);           // um einen PWM zu aktivieren
void UB_MCP25050_PWM_Value(MCP_GPIO_t pin, uint8_t duty_cycle);           // um den DutyCycle eines PWM einzustellen
void UB_MCP25050_writeRegister(uint8_t adr, uint8_t wert, uint8_t maske); // zum beschreiben eines RAM-Registers

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//--------------------------------------------------------------
// File     : main.c
// Datum    : 21.09.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der MCP25050 Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_mcp25050.h"
#include "stm32_ub_led.h"
 
int main(void)
{
  uint32_t mcp_ok=0;
  uint32_t n;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // init der LEDs
  UB_Led_Init();
 
  // init vom MCP25050
  UB_MCP25050_Init();
 
  while(1)
  {
    if(mcp_ok==0) {
      UB_Led_On(LED_RED);
      // MCP25050 am CAN-Bus suchen
      if(UB_MCP25050_Check()==SUCCESS) {
        // MCP25050 gefunden
        mcp_ok=1;
        // GPIO0 und GPIO1 als Ausgang definieren
        UB_MCP25050_PIN_Define(MCP_GP0, MCP_GPIO_OUT);
        UB_MCP25050_PIN_Define(MCP_GP1, MCP_GPIO_OUT);
        // an GPIO0 einen Lo-Pegel ausgeben
        UB_MCP25050_GPIO_Lo(MCP_GP0);
        // an GPIO1 einen Hi-Pegel ausgeben
        UB_MCP25050_GPIO_Hi(MCP_GP1);
      }
    }
    else {
      // MCP25050 ist ok
      UB_Led_Off(LED_RED);
      UB_Led_On(LED_GREEN);
    }
  }
}

Hier die Library zum Download :

ub_stm32f4_can_mcp25050_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_60_CAN_MCP25050


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

2 Kommentare zu 60-CAN_MCP25050-Library (STM32F4)

  1. Joachim Kraatz sagt:

    Hallo admin_ub und alle Mitleser,
    ich habe jetzt auch einen MCP25050 zum Laufen bekommen; dazu verwendete ich mein altes GALEP 3 (noch mit Parallel-Port). Ich habe nur die 3 CNF Register angepasst, der Chip läuft jetzt mit 125000 und 16 MHz-Quarz. Meine Werte: CNF1:0x07 CNF2: 0x90 CNF3: 0x02. Nicht vergessen, die richtige Checksumme im EPROM zu hinterlegen; im Internet fand ich dafür einen geeigneten Checksummen-Rechner.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.