Hur kan jag få tag på prestandaversionen av Nucleo?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndLi
Inlägg: 17049
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av AndLi »

Behövs verkligen HAL_Delay anropen? HAL_GPIO_* funktionerna upplever jag som relativt slöa så klockfrekvensen ut blir ju inte enorm om man kör utan...

Följer det inte med exempel för hårdvaruSPI via HAL i STM32Cube (Titta i katalogstrukturen där du installerat det)?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Rick81 skrev:
(data[x] & (1 << i))
Detta är för att skicka den högsta biten först (MSB) och det är så SPI brukar fungera. Detta görs normalt av hårdvaran.

Utan att se din hårdvaru SPI kod är det svårt att säga vad som är fel, men om du bara läser ut en temperatur varje sekund, spelar det ingen roll om du kör mjukvaru SPI eller hårdvaru SPI.

Sne är det ju bra om du säger hur SPIvärdena blir fel, det brukar gå slutsatser av det om man vet vad man förväntar sig. Tex får du ex bara 0xFF så är det troligt att chippet inte får nån Chipenable eller klocka. Har du oscilloskop kan du mäta på signalerna och se att de ser korrekta ut.
Tack för informationen. Då vet jag att SPI skickar första bitten först. Jag har valt Software SPI då jag inte lyckades skriva om till hårdvaru. Men nu när du har sagt detta ovan så kanske jag får lägga till det i min TODO list.

Jag har ett annat mystiskt SPI problem.
Jag har 3 stycken MAX31865 kort. Men bara 1 verkar fungera. De övriga har MISO, MOSI, SCK och CE ansluta och jag har varit där med multimeter. Om MISO, MOSI, SCK fungerar för en av dom, så fungerar det för alla.

Men jag har ändå problem med PT100 mätning. Om jag lyckas med detta så kan jag lägga upp bilden på min apparat :)
* Tre stycken MAX31865!
* En visar korrekt temperatur.
* Alla visar statiskt 856.89 vid o-inkopplad PT100 (4-tråd)
* Dom "o-fungerande" visar pendlande 654.51 vid inkopplad PT100. Också ändras talet om man tar på PT100 med handen.

Har detta bibliotek någon speciell inställning för...jag vet inte...skalning? Jag körde mitt tidigare bibliotek och då fick jag sätta threshold-värden på två MAX31865 för om den skulle larma om temperaturen var för höga, eller låga. Jag gjorde inte det på den tredje MAX31865.

Kan detta spöka till med MAX31865?
AndLi skrev:Behövs erkligen HAL_Delay anropen? HAL_GPIO_* funktionerna upplever jag som relativt slöa så klockfrekvensen ut blir ju inte enorm om man kör utan...

Följer det inte med exempel för hårdvaruSPI via HAL i STM32Cube (Titta i katalogstrukturen där du installerat det)?
Nej. Faktiskt inte. Bara när man ska läsa temperaturen så behövs viss fördröjning på 10 ms och 65 ms. Jag tycker att den går snabbt nu. Tydligen MÅSTE det vara en förtröjning på 10 ms och 65 ms vid temperaturläsning för att kondensatorerna ska laddas upp.
Senast redigerad av DanielM 11 december 2019, 00:02:08, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av TomasL »

ansluta och jag har varit där med multimeter
Hur kan du verifiera att det är korrekt med multimeter?
Det är ju faktiskt en fullständig omöjlighet.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Alltså kollade bara om det var kontakt :) Pip!
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av TomasL »

Tja, då vet du ju inte om signalerna finns där eller inte, dessutom inte korrekt följd.
Kollade du alla CE-linor också?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Jag kollade om den hade 5V matning. OK. Om den var ansluten till GND. OK. Om den hade MISO, MOSI, SCK. OK.
Sedan kollade jag om CE pinnarna hade anslutning. OK. CE linorna har jag kollat extra noga och verkligen sett att dom sitter anslutna.

Men med tanke på att min LCD visar värdesförändringar om jag kopplar in min PT100 på ett sådant MAX kort som visar fel värden. Kollar jag ur någon tråd på MAX kortet, så visar min LCD andra värden.

Så oansluten verkar dom inte vara. Då kanske det är threshold som biblioteket talar om? Tror jag ska försöka skriva lite C-kod för att få ut status-koden. Enligt databladet så kan man det.

Edit:
Oinkopplad: Statuserror 128 = Alla fel
Inkoplad: Statuserror 0 = Inga fel
Inkopplad, men kopplar ur en tråd så det blir 3 trådigt: Statuserror 64 = Threshold för hög. ( logiskt)

Ändå visar den fel värden i temperatur. Då kanske det är någon typ utav kalibrering? Skulle fått nollställa dessa!
https://datasheets.maximintegrated.com/ ... X31865.pdf

Edit2:
Eller så skalar jag bara om 654.51 till ca 21 grader. 21/654.51 = k typ.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Tror jag hittat felet nu!

Säger jag att jag ska ha WIRE4 så blir konfigureringen WIRE3 när jag läser den. Om jag BARA skriver konfiguering och sedan läser den så blir den som jag har skrivit. Men så fort jag börjar med att använda biblioteket så ändras konfigueringen...som något ligger kvar eller fel angående minnesskrivningarna.

Detta är bra! Nu har jag något att söka gå på.

Jag skulle gärna behöva lite hjälp med att läsa databladet för att veta vad exakt jag ska skicka. Jag har skrivit bibliotek och grottat ned mig i det, men det har inte riktigt fungerat för mig. När jag är klar så lägger jag upp mitt projekt + bild :)

https://datasheets.maximintegrated.com/ ... X31865.pdf

Det jag måste göra är att skriva till tabell 2, tabell 5. Samt läsa från tabell 2 och tabell 7.

Vi kan börja med hur jag ska tolka denna?
Jag VET att det är ett SPI protokoll, men är det något val man ska göra eller är det bara ett sätt som man kan skriva?

För att skriva 8 bit data så börjar man först skicka adressen och sedan datat. Men vad händer om man vill läsa 16 Bit data? Då måste man skicka adressen och sedan läsa 16 Bit, dvs 2 stycken 8 bit? Ingen annan konfigurering behöver man ta hänsyn till förutom att SPI klockan ska vara inställd på CPOL = Låg och MSB?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av Shimonu »

Sista bilden visar multibyte transfer. Precis så funkar det.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Så för att t.ex. skriva 16 bit data, så börjar jag först skicka 8 bit address och sedan 16 bit data. Dvs i en array [addr, data0, data1]? Svårare än så är det inte?

Samma sak om jag ska läsa data? Då skickar jag addressen och sedan läser direkt efter? Och vill jag bara skriva 8 bit data, så skriver jag [addr, data0]?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Jag förstår inte. Detta är 4:e gången jag skriver ett bibliotek och jag får ingen kommunikation med den. Det går bra med mjukvaru SPI, men inte hårdvaru SPI.

Det som händer är att om jag skriver konfigueringen och sedan läser, så händer det inget. Jag får ingen konfiguering.

Jag börjar med att sätta skicka address och sedan data. Sedan så vill jag läsa data, jag skickar då samma address |= 0x80 = 0x84 och sedan ger jag den en buffert så den kan skriva till. Jag sätter buffern till t.ex. 5 och förväntar mig att bli omskriven, men icke!

Alltså SPI:n verkar inte tala med IC-chipen. Ja. Det är RÄTT MISO, MOSI, SCK osv. Det fungerar ju med mjukvari SPI, trots att även där blev lite fel, men ändå visade en givare rätt.

Kod: Markera allt


#include "MAX31865.h"

/*
 * Write to
 */
static void MAX31865_write(MAX31865_SPI* spi, uint8_t* address, uint8_t* set, uint8_t lenght) {
	HAL_GPIO_WritePin(spi->CE_PORT, spi->CE_PIN, GPIO_PIN_RESET);
	HAL_SPI_Transmit(spi->hspi, address, (uint16_t) 1, 10); // Send first address
	HAL_SPI_Transmit(spi->hspi, set, (uint16_t) lenght, 10); // Then send data
	HAL_GPIO_WritePin(spi->CE_PORT, spi->CE_PIN, GPIO_PIN_SET);
}

/*
 * Read from
 */
static void MAX31865_read(MAX31865_SPI* spi, uint8_t* address, uint8_t* get, uint8_t lenght) {
	HAL_GPIO_WritePin(spi->CE_PORT, spi->CE_PIN, GPIO_PIN_RESET);
	HAL_SPI_Transmit(spi->hspi, address, (uint16_t) 1, 10); // Send first address
	HAL_SPI_Receive(spi->hspi, get, (uint16_t) lenght, 10);  // Then receive data
	HAL_GPIO_WritePin(spi->CE_PORT, spi->CE_PIN, GPIO_PIN_SET);
}

float MAX31865_temperature(MAX31865_SPI* spi) {

	/* Begin first to enable bias */
	uint8_t data = 0x00;
	data |= MAX31865_VBIAS_ON;
	data &= ~MAX31865_CONVERSION_MODE_AUTO; // OFF
	data &= ~MAX31865_ONE_SHOT_ON; // OFF
	if (spi->WIRES == WIRE3) {
		data |= MAX31865_3_WIRE; // 3 wire
	} else {
		data &= ~MAX31865_3_WIRE; // 2 or 4 wire
	}
	data |= MAX31865_FAULT_DETECTION_AUTOMATIC;
	data &= ~MAX31865_FAULT_STATUS_CLEAR;
	data |= MAX31865_50_HZ_FILTER;

	// 0x80 will convert to WRITE address
	uint8_t address = MAX31865_CONFIGURATION | 0x80;
	MAX31865_write(spi, &address, &data, 1);
	HAL_Delay(11); // Need to wait 10.5 ms after Vbias is ON according to data sheet

	/* Enable single shot */
	data = 0x00;
	data |= MAX31865_VBIAS_ON;
	data &= ~MAX31865_CONVERSION_MODE_AUTO; // OFF
	data |= MAX31865_ONE_SHOT_ON;
	if (spi->WIRES == WIRE3) {
		data |= MAX31865_3_WIRE; // 3 wire
	} else {
		data &= ~MAX31865_3_WIRE; // 2 or 4 wire
	}
	data |= MAX31865_FAULT_DETECTION_AUTOMATIC;
	data &= ~MAX31865_FAULT_STATUS_CLEAR;
	data |= MAX31865_50_HZ_FILTER;

	// 0x80 will convert to WRITE address
	address = MAX31865_CONFIGURATION | 0x80;
	MAX31865_write(spi, &address, &data, 1);
	HAL_Delay(63); // Need to wait 62.5 ms after Single shoot is ON according to data sheet

	/* Read temperature now */
	uint8_t buffer[2];
	address = MAX31865_RTD_MSB;
	MAX31865_read(spi, &address, buffer, 2);
	uint16_t rawResistance = buffer[0] << 8;
	rawResistance |= buffer[1];
	rawResistance >>= 1;
	float resistance = ((float) data * MAX31865_RREF) / MAX31865_FACTOR;
	spi->resistance = resistance;
	float temperature = ((resistance / 100) - 1) / MAX31865_ALPHA;

	/* Disable bias voltage to reduce power usage */
	data = 0x00;
	data &= ~MAX31865_VBIAS_ON; // OFF
	data &= ~MAX31865_CONVERSION_MODE_AUTO; // OFF
	data &= ~MAX31865_ONE_SHOT_ON; // OFF
	if (spi->WIRES == WIRE3) {
		data |= MAX31865_3_WIRE; // 3 wire
	} else {
		data &= ~MAX31865_3_WIRE; // 2 or 4 wire
	}
	data |= MAX31865_FAULT_DETECTION_AUTOMATIC;
	data &= ~MAX31865_FAULT_STATUS_CLEAR;
	data |= MAX31865_50_HZ_FILTER;

	// 0x80 will convert to WRITE address
	address = MAX31865_CONFIGURATION | 0x80;
	MAX31865_write(spi, &address, &data, 1);

	/* Return temperature */
	return temperature;

}

/*
 * Get the error codes
 */
uint8_t MAX31865_fault(MAX31865_SPI* spi){
	uint8_t address = MAX31865_FAULT_STATUS;
	uint8_t data = 0x2;
	MAX31865_read(spi, &address, &data, 1);
	return data;
}

/*
 * Get the configuration
 */
uint8_t MAX31865_configuration(MAX31865_SPI* spi){
	uint8_t address = MAX31865_CONFIGURATION;
	uint8_t data = 12;
	MAX31865_read(spi, &address, &data, 1);
	return data;
}

void MAX31865_init(MAX31865_SPI* spi, GPIO_TypeDef* CE_PORT, uint16_t CE_PIN, SPI_HandleTypeDef* hspi, uint8_t WIRES) {
	// Declare structure
	spi->CE_PIN = CE_PIN;
	spi->CE_PORT = CE_PORT;
	spi->WIRES = WIRES;
         spi->hspi = hspi;

	// CE in reset state
	HAL_GPIO_WritePin(spi->CE_PORT, spi->CE_PIN, GPIO_PIN_SET);

	// Do default configuration and begin with creating the data
	uint8_t data = 0x00;
	data &= ~MAX31865_VBIAS_ON; // OFF
	data &= ~MAX31865_CONVERSION_MODE_AUTO; // OFF
	data &= ~MAX31865_ONE_SHOT_ON; // OFF
	if (spi->WIRES == WIRE3) {
		data |= MAX31865_3_WIRE; // 3 wire
	} else {
		data &= ~MAX31865_3_WIRE; // 2 or 4 wire
	}
	data |= MAX31865_FAULT_DETECTION_AUTOMATIC;
	data &= ~MAX31865_FAULT_STATUS_CLEAR; // OFF
	data |= MAX31865_50_HZ_FILTER;

	// 0x80 will convert to WRITE address
	uint8_t address = MAX31865_CONFIGURATION | 0x80;
	MAX31865_write(spi, &address, &data, 1);

}

Kod: Markera allt


#ifndef MAX31865_LIB_MAX31865_H
#define MAX31865_LIB_MAX31865_H

#include "main.h"

// Configurations
#define MAX31865_VBIAS_ON 0x80
#define MAX31865_CONVERSION_MODE_AUTO 0x40
#define MAX31865_ONE_SHOT_ON 0x20
#define MAX31865_3_WIRE 0x10
#define MAX31865_FAULT_DETECTION_AUTOMATIC 0x04
#define MAX31865_FAULT_STATUS_CLEAR 0x2
#define MAX31865_50_HZ_FILTER 0x1
#define MAX31865_60_HZ_FILTER 0x0

// Address
#define MAX31865_CONFIGURATION 0x00
#define MAX31865_RTD_MSB 0x01
#define MAX31865_RTD_LSB 0x02
#define MAX31865_HIGH_FAULT_THRESHOLD_MSB 0x03
#define MAX31865_HIGH_FAULT_THRESHOLD_LSB 0x04
#define MAX31865_LOW_FAULT_THRESHOLD_MSB 0x05
#define MAX31865_LOW_FAULT_THRESHOLD_LSB 0x06
#define MAX31865_FAULT_STATUS 0x07

// Sensor defines
#define MAX31865_RREF 430                        // Reference resistor
#define MAX31865_FACTOR 32768                    // 2^15 used for data to resistance conversion
#define MAX31865_ALPHA 0.003851                  // PT-100 temperature coefficient

// User defines
#define WIRE4 4
#define WIRE3 3
#define WIRE2 2

typedef struct {
    GPIO_TypeDef* CE_PORT;
    uint16_t CE_PIN;
    SPI_HandleTypeDef* hspi;
    uint8_t WIRES;
    float resistance; // Will be updated every time we read temperature
} MAX31865_SPI;

void MAX31865_init(MAX31865_SPI* spi, GPIO_TypeDef* CE_PORT, uint16_t CE_PIN, SPI_HandleTypeDef* hspi, uint8_t WIRES);
float MAX31865_temperature(MAX31865_SPI* spi);
uint8_t MAX31865_fault(MAX31865_SPI* spi);
uint8_t MAX31865_configuration(MAX31865_SPI* spi);
#endif //MAX31865_LIB_MAX31865_H

Senast redigerad av DanielM 13 december 2019, 00:30:49, redigerad totalt 1 gång.
Användarvisningsbild
AndLi
Inlägg: 17049
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av AndLi »

Det är nu du hade haft nytta av oscilloskopet... Att mäta är att veta..

Men var initierar du porten och SPI?
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av mankan »

Det är inte så att CE-signalen behöver vara aktiv en liten stund innan du börjar skicka data?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

AndLi skrev:Det är nu du hade haft nytta av oscilloskopet... Att mäta är att veta..

Men var initierar du porten och SPI?
Jag vet. Önskar mig en sådan. Man med tanke på att jag har kopplat rätt. Dom är anslutna och jag har kod som kan tala med IC chipet på ett hyffsat sätt.

Hoppas denna bild ska säga mycket.

Kod: Markera allt

// Temperature sensors
  MAX31865_init(&spi0, GPIOB, GPIO_PIN_14, &hspi2, WIRE4); // 14 = CE0
  MAX31865_init(&spi1, GPIOB, GPIO_PIN_15, &hspi2, WIRE4); // 15 = CE1
  MAX31865_init(&spi2, GPIOB, GPIO_PIN_12, &hspi2, WIRE4); // 12 = CE2
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 13 december 2019, 00:21:40, redigerad totalt 1 gång.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

mankan skrev:Det är inte så att CE-signalen behöver vara aktiv en liten stund innan du börjar skicka data?
Jag testade sätta en fördröjning på 10 ms efter CE linan har blivit låg. Gav inget resultat. Kan testa igen.

Edit:

OK! Nu har jag fått någon indikering! När jag kör denna kod och anropar MAX31865_configuration så retunerar den 128 tillbaka. Alla vet att 128 = 0b1000000 (VBias = ON). Men i detta fall så verkar den bara läsa en 1:a och sedan nollor, istället för att retunera en 5:a tillbaka.

Kod: Markera allt

/*
 * Get the configuration
 */
uint8_t MAX31865_configuration(MAX31865_SPI* spi){
	uint8_t address = MAX31865_CONFIGURATION;
	uint8_t data = 5;
	MAX31865_read(spi, &address, &data, 1);
	return data;
}

void MAX31865_init(MAX31865_SPI* spi, GPIO_TypeDef* CE_PORT, uint16_t CE_PIN, SPI_HandleTypeDef* hspi, uint8_t WIRES) {
	// Declare structure
	spi->CE_PIN = CE_PIN;
	spi->CE_PORT = CE_PORT;
	spi->WIRES = WIRES;
	spi->hspi = hspi;

	// CE in reset state
	HAL_GPIO_WritePin(spi->CE_PORT, spi->CE_PIN, GPIO_PIN_SET);

	// Do default configuration and begin with creating the data
	uint8_t data = 0x00;
	data &= ~MAX31865_VBIAS_ON; // OFF
	data &= ~MAX31865_CONVERSION_MODE_AUTO; // OFF
	data &= ~MAX31865_ONE_SHOT_ON; // OFF
	if (spi->WIRES == WIRE3) {
		data |= MAX31865_3_WIRE; // 3 wire
	} else {
		data &= ~MAX31865_3_WIRE; // 2 or 4 wire
	}
	data |= MAX31865_FAULT_DETECTION_AUTOMATIC;
	data &= ~MAX31865_FAULT_STATUS_CLEAR; // OFF
	data |= MAX31865_50_HZ_FILTER;

	// 0x80 will convert to WRITE address
	uint8_t address = MAX31865_CONFIGURATION | 0x80;
	MAX31865_write(spi, &address, &data, 1);

}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur kan jag få tag på prestandaversionen av Nucleo?

Inlägg av DanielM »

Har införskaffat ett oscilloskop nu.
Skriv svar