MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

Hej!

Jag har skrivit av Arduino C++ kod till STM32 C-kod från https://github.com/coryjfowler/MCP_CAN_lib
Jag har kopplat ihop en servomotor med CAN-buskortet, men inget händer. Jag har tyvärr inget skåp att analysera signalerna i. Så jag tänkte dela med mig av koden till er om ni vill testa den och återkoppla om det fungerar.

Koden har samma funktionalitet som Arduino C++ koden. Vad tror ni?

Minimalt exempel:

Kod: Markera allt

  #include "MCP2515/mcp2515.h"

  SPI_HandleTypeDef hspi2;
  UART_HandleTypeDef huart2; 
  MCP2515_SPI spi;

  // Init MCP2515
  MCP_CAN_start(&spi, &hspi2, CAN_CS_GPIO_Port, CAN_CS_Pin);
  MCP_CAN_begin(&spi, MCP_ANY, CAN_250KBPS, MCP_16MHZ);
  MCP_CAN_setMode(&spi, MCP_NORMAL);

  // message
  uint8_t message[8] = {0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  uint32_t address = 0x0CFE3022;
  uint8_t i = 0;
  while (1)
  {
	  message[0] = i;
	  i++;
	  if(i >= 249)
		  i = 0;
	  uint8_t sndStat = MCP_CAN_sendMsgBuf_ext(&spi, address, 1, 8, message); // Send with extended
	  if(sndStat == CAN_OK){
		  uint8_t status[8] = "Success!";
		  HAL_UART_Transmit(&huart2, status, sizeof(status), 10);
	  } else {
		  uint8_t status[6] =  "Fail!";
		  HAL_UART_Transmit(&huart2, status, sizeof(status), 10);
	  }

	  HAL_Delay(200);
  }

Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 11 juli 2020, 20:45:05, redigerad totalt 1 gång.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av mankan »

Måste du inte anropa nån HAL setup (CubeMX?) där SPI-blocket dras igång, IO-pinnar ställs in, klockor dras igång osv eller sköts det under huven i ditt fall?

Annan idé är ju att dra in Arduino på din STM32 och du får en felkälla mindre (din port av koden). Samt Arduino drar säkerligen igång SPI åt dig.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

mankan skrev:Måste du inte anropa nån HAL setup (CubeMX?) där SPI-blocket dras igång, IO-pinnar ställs in, klockor dras igång osv eller sköts det under huven i ditt fall?

Annan idé är ju att dra in Arduino på din STM32 och du får en felkälla mindre (din port av koden). Samt Arduino drar säkerligen igång SPI åt dig.
Sådant gör jag i CubeMX :)

Jag har tyvärr ingen Arduino.

Nu har jag gjort ett test. Tydligen så kan STM32 inte initialisera MCP2515.
Antingen är SPI:n sönder (råkade koppla in 16 volt på STM32 kortet när 12-volts regulatorn var inkopplad. Nätaddaptern stod 12 volt, men visade 16 volt i verkligheten. Det började luckta bränt. En LCD som drivs av SPI slutade fungera, om det var LCD:n eller SPI:n som gick sönder - vet jag inte) eller så är MCP2515 något fel på, eller så har jag valt fel konfiguration.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av mankan »

Alltså, Arduino finns portat till STM32.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

Vill inte riskera. Bättre att felsöka som vanligt.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

Här är ETT av problemen. Variabeln "ret" är 0 eller 255. I vissa fall så ska den inte vara noll.

Kod: Markera allt

static uint8_t MCP_CAN_mcp2515_readRegister(MCP2515_SPI *spi, uint8_t address) {

	HAL_GPIO_WritePin(spi->CS_PORT, spi->CS_PIN, GPIO_PIN_SET);
	uint8_t pData[2] = { MCP_RESET, address };
	HAL_SPI_Transmit(spi->hspi, pData, 2, 5);
	uint8_t ret;
	HAL_SPI_Receive(spi->hspi, &ret, 1, 5);
	HAL_GPIO_WritePin(spi->CS_PORT, spi->CS_PIN, GPIO_PIN_RESET);

	return ret;
}
Ekvivalent Arduino kod.

Kod: Markera allt

INT8U MCP_CAN::mcp2515_readRegister(const INT8U address)                                                                     
{
    INT8U ret;

    SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));
    MCP2515_SELECT();
    spi_readwrite(MCP_READ);
    spi_readwrite(address);
    ret = spi_read();
    MCP2515_UNSELECT();
    SPI.endTransaction();

    return ret;
}
Tror ni att man ska försöka använda denna istället?

Kod: Markera allt

HAL_SPI_TransmitReceive(hspi, pTxData, pRxData, Size, Timeout)
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av Mr Andersson »

Varför skickar du MCP_RESET när arduinokoden använder MCP_READ?
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

Ah! Det kan vara en orsak!

Jag har iallafall spenderat tid på att använda ett annat bibliotek som verifierar att SPI:n är OK. Får error om jag kopplar ur SPI-klockan.
Så då vet jag det att kortet är OK.
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av Rick81 »

Finns det nån speciell anledning till att du använder externa SPI till CAN eller SPI till PWM istället för använda STM32 inbyggda funktioner för det?
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

För jag använder en STM32 F401RE just nu. Min F446RE är upptagen för ett LCD styrt adaptiv regleringsprojekt som ska vara öppen källkod :)

Jag använder detta bibliotek just nu: https://github.com/eziya/STM32_SPI_MCP2515
Denna fungerar att ansluta MCP2515, men min Sonceboz stegmotor svarar ändå inte. Jag har protokollet + exemelkod, men får fortfarande inte det att fungera.

Om ni vill så kan jag berätta lite om min Sonceboz stegmotor. Jag har projektkoden för en TTController, men denna kod svarar absolut inte.
Jag tänkte om jag kunde få igång denna motor så kan jag göra ett adaptivt expriment med olinjär styrning. Varför då?
Jo, för normalt så brukar man ha en förare bakom en hydraulisk styrning. Jag vill testa om man kan ersätta detta med en dator. Varför en förare? Jo, för att föraren har dynamiken i joystiken.

Kod: Markera allt

  uCAN_MSG txMessage;
  uCAN_MSG rxMessage;

  bool status = CANSPI_Initialize();
  uint8_t message[3] = "OK";
  if(status)
	  HAL_UART_Transmit(&huart2, message, 3, 10); // Visar OK :)

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  if(CANSPI_Receive(&rxMessage))
	      {
	        txMessage.frame.idType = rxMessage.frame.idType;
	        txMessage.frame.id = rxMessage.frame.id;
	        txMessage.frame.dlc = rxMessage.frame.dlc;
	        txMessage.frame.data0++;
	        txMessage.frame.data1 = rxMessage.frame.data1;
	        txMessage.frame.data2 = rxMessage.frame.data2;
	        txMessage.frame.data3 = rxMessage.frame.data3;
	        txMessage.frame.data4 = rxMessage.frame.data4;
	        txMessage.frame.data5 = rxMessage.frame.data5;
	        txMessage.frame.data6 = rxMessage.frame.data6;
	        txMessage.frame.data7 = rxMessage.frame.data7;
	        CANSPI_Transmit(&txMessage);
	        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // <--- Händer inget här. Ingen LED lyser
	      }


	      txMessage.frame.idType = dSTANDARD_CAN_MSG_ID_2_0B;
	      txMessage.frame.id = 0x0CFE3022;
	      txMessage.frame.dlc = 8;
	      txMessage.frame.data0 = 0xFA;
	      txMessage.frame.data1 = 0xFF;
	      txMessage.frame.data2 = 0x30;
	      txMessage.frame.data3 = 0xFF;
	      txMessage.frame.data4 = 0xFF;
	      txMessage.frame.data5 = 0xFF;
	      txMessage.frame.data6 = 0xFF;
	      txMessage.frame.data7 = 0xFF;
	      uint8_t returnValue = CANSPI_Transmit(&txMessage);
	      char val[20];
	      sprintf(val, "val=%d \n", returnValue);
	      HAL_UART_Transmit(&huart2, (uint8_t*) val, sizeof(val), 10); // Visar bara 0 hela tiden

	      HAL_Delay(1000);
  }
valves.png
Just när man skulle lägga ned allt så började returnValue visa 1när jag kopplade in juperwire 120 Ohm. :D
dd789d454f4c51cba1fd910f0efeec3a.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av Rick81 »

Ja CAN behöver oftast ett terminernsmotstånd...eller helst ett på varje "ände" av bussen.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

LED-lampan lyser också. Tyder på att den fick ett meddelande från Sonceboz-motorn.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

Har hittat en felkod nu och skulle behöva låta er lite för att tolka vad den säger.

Jag avlyssnar den hela tiden och jag får olika koder bland annat att den har anslutning, positionen samt flödesestimatet (den räknar ut flödet som en ventil ska ge, grundat på positionen på sliden). Men jag får en felkod.
Message ID: 18 FE CA 8D
byte0=0xFB = 11111011
byte1=0xFF = 11111111
byte2=0x9E = 10011110
byte3=0x00 = 00000000
byte4=0x12 = 00010010
byte5=0x7F = 01111111 (fix)
byte6=0xFF = 11111111 (fix)
byte7=0xFF = 11111111 (fix)
Till att börja med så är 8D sjäva "SA" = Source address och tillsammans med 18 FE CA så bildar den CAN-bus ID:et på en felkod.
byte0 till byte7 är det som talar om felkodens betydelse och jag har problem att läsa utav den.
Sélection_040.png
Jag kan börja med att klippa ur lite datablad i form av bilder. Om ni undrar varför det står "preliminary" har med att denna produkt är skrotad sedan länge tillbaka. Jag fick då ta över den och leka lite med den. :tumupp:
Sélection_033.png
Sélection_034.png
Då är min teori att felkoden är:
Sélection_035.png
Varför då? Jo om by börjar på byte0=0xFB = 11111011 så passar visar den att
Sélection_036.png
EDIT: Fel av mig! byte0=0xFB = 00000000 visar den nu. Jag hade skrivit fel i koden (skrivit txMessage istället för rxMessage). Nu kan vi klart avgöra vilken felkod det är. Det ska vara 24 volt har jag för mig att dom ska drivas med.

Och om vi går tillbaka till databladet igen så ser vi att 11, 10 är reserver, dvs dom betyder absolut inget.
Sélection_037.png
Samma sak gäller byte1=0xFF = 11111111. Finns ingen lampa som är ON. Nu är det ingen fysisk lampa som det talas som, snarare en varningsflagga(ej fysisk varningsflagga heller :mrgreen: )

Nu går vi vidare till byte2=0x9E = 10011110 och byte3=0x00 = 00000000. Jag får alltså att SPN(Suspect parameter number) är 0x9E och 0x00.

Och sist har vi byte4=0x12 = 00010010. Här är dom två första bitarna ett SPN nummer, men det är 0 på den. Allt vad byte4 visar är FMI = 0x12
Sélection_038.png
byte5 -> byte7 är fixerad och visar alltid samma nummer.

Allså betyder detta att jag har för lång spänning om man tittar på vad FMI betyder? 0x12 = 18. Detta betyder att "below normal operation range"? Jag har för dålig spänningskälla?
Sélection_039.png
Jag kör med 12 volt och 10A nätaggregat. Min stegmotor ska ha mellan 8 till 32 Volt och 2.6A. Ändå rör sig inte min stegmotor något. Absolut inget. Helt tyst.

Jag kör med ett sådant nätaggregat.
243974_44479.jpeg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av DanielM »

Någon som kan förklara SA = Source Address och DA = Destination address i CAN-bus? Jag har ett dokument som babblar mycket om DA och SA hit och dit. Men jag tycker dom blandar ihop det.

Så om vi tar t.ex motor och CAN-bus transmitter. Kan man då sätta DA och SA på både motorn och transmittern?
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: MCP2515 CAN-bus C-kod till STM32 - Kan någon testa?

Inlägg av Rick81 »

Du visar inte dokument men jag tror att SA är den som skickar och DA den som tar emot meddelandet. Så beroende på vem som skicka blir SA och DA olika.

Ex skickar STM32 till motor blir:
SA = STM32
DA = motor

Skickar motor till STM32:
SA = motor
DA = STM32

Kan det vara därför du tycker de blandar ihop det?
Skriv svar