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...

3 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.

    • admin_mb sagt:

      Hallo Joachim,
      vielen Dank für dieses Feedback;)
      LG Manfred

      PS: Ich wünschte mir noch viel mehr solcher Feedbacks…

  2. Philipp sagt:

    @Joachim Kraatz,

    vielen vielen Dank für das aufzeigen deiner CNF Register Werte!
    Ich habe bereits 9 MCP25050 in den Müll hauen müssen auf Grund einer falschen TQ Berechnung aus einem Tool, welches eigentlich genau dafür gemacht wurde.
    Dieses Tool hat mir zwei Möglichkeiten für das erreichen von 125kbps aufgezeigt, 16TQs oder 8TQs.
    Mit 16TQs habe ich es allerdings nie geschafft die benötigte Frequenz zu erreichen mit 8 geht es.

    Danke!

Schreibe einen Kommentar

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