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 :
Hier der komplette CooCox-Projektordner zum Download :
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.
Hallo Joachim,
vielen Dank für dieses Feedback;)
LG Manfred
PS: Ich wünschte mir noch viel mehr solcher Feedbacks…
@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!
Hallo Manfred,
ich bin schon etwas am Verzweifeln. Für ein Studienprojekt verwende ich den STm32F407 und MCP25050. Wie du ja auch weiter oben schreibst müssen die MCP25050 mit einem HEX-File Programmiert werden. Dazu fehlt mir noch der richtige Programmieradapter. Hast du da einen Tipp für mich, der nicht wie bei Galep-5 bei 500 Euro liegt? Ich muss den Programmieradapter nämlich gemeinsam mit dem Projekt abgeben.
Herzlichen Dank für die Informationen hier und deine Antwort.
Gabriel
Hallo Gabriel,
nach kurzer Suche bin ich auf den PICkit2 bzw. PICkit3 gestoßen. Beide unterstützten MCP250xx CAN Devices
MCP25020, 25025,MCP25050, 25055. Der PICkit2 ist aber scheinbar einfacher in der Handhabung.
Bei Amazon gibt es ein PICKit 2 für 21,99 EUR. Die Software dazu findet sich auch noch im Netz.
LG, Manfred