Ich habe das Programm jetzt ein wenig umgeschrieben, damit die Daten dem Transceiver übergeben werden. Vielleicht magst du da noch einmal kurz drüber gucken. Die Temperaturmessung funktioniert auch damit einwandfrei (ganzzahlige Werte reichen aus).
Zum Auslesen des MAX31865 und zum anschließenden Senden an den Transceiver, lese ich MSB und LSB einzeln aus mit:
Code: Alles auswählen
// MSB Register auslesen
uint8_t maxRTD_read_MSB(void)
{
uint8_t buf[3];
buf[0] = 0x01; // Lese-Adresse des MSB-Registers
buf[1] = 0x00; // nicht zwingend notwendig aber sauberer zum Messen
spi_transfer(buf, 2); // Schreiben und gleichzeitiges Auslesen
return (buf[1]); // 8 Bit (MSB) Register als Rückgabewert
}
// LSB Register auslesen
uint8_t maxRTD_read_LSB(void)
{
uint8_t buf[3];
buf[0] = 0x02; // Lese-Adresse des MSB-Registers
buf[1] = 0x00; // nicht zwingend notwendig aber sauberer zum Messen
spi_transfer(buf, 2); // Schreiben und gleichzeitiges Auslesen
return (buf[1]); // 8 Bit (LSB) Register als Rückgabewert
}
Die Funktion für die Schnittstelle mit dem Transceiver ist gleich der für den MAX31865:
Code: Alles auswählen
void spi_transceiver (uint8_t *tBuf, uint8_t len) // *pBuf = Pointer
{
int8_t t; // Laufvariable
SCLK = 0;
CS_TRANS = 0; // 0 oder 1?
if(tBuf == 0) return;
while(len) { // len = Anzahl zu übertragenden Bytes
for (t=7; t>=0; t--) { // Durchlauf von i=0 bis i=7
__delay32(100); // Wartezeit
SCLK ^= 1;
// Schreiben
SDO = ((*tBuf) & (1<<t)); // bitweise *pBuf auf 1 prüfen, dann SDO setzen
__delay32(100);
SCLK ^= 1;
// // Einlesen
// if (SDI) {
// *tBuf |= (1<<t); // bitweises ODER: setzt i-tes Bit, auf das pBuf zeigt
// }
// else {
// *tBuf &= ~(1<<t); // Löschung des i-ten Bits, auf das pBuf zeigt
// }
}
tBuf++;
len--;
}
__delay32(100);
CS_TRANS = 1; // 0 oder 1?
}
Für den Transceiver und dem MAX31865 nutze ich die gleichen Leitungen für Clock, SDO und SDI. CS ist natürlich verschieden.
Für das Senden an den Transceiver nutze ich:
Code: Alles auswählen
void trans_send (uint8_t MSB_data_max, uint8_t LSB_data_max)
{
uint8_t buf[3];
buf[0] = 0x66; // FW Command
buf[1] = MSB_data_max;
buf[2] = LSB_data_max;
spi_transceiver (buf, 3);
}
Und in der main-Funktion wird das dann so verwendet:
Code: Alles auswählen
MSB_data = maxRTD_read_MSB();
LSB_data = maxRTD_read_LSB();
trans_send(MSB_data, LSB_data);
Am Empfänger soll dann erst das Ergebnis um einen nach rechts geshiftet werden und die Temperatur berechnet werden.
Ich habe das Programm jetzt ein wenig umgeschrieben, damit die Daten dem Transceiver übergeben werden. Vielleicht magst du da noch einmal kurz drüber gucken. Die Temperaturmessung funktioniert auch damit einwandfrei (ganzzahlige Werte reichen aus).
Zum Auslesen des MAX31865 und zum anschließenden Senden an den Transceiver, lese ich MSB und LSB einzeln aus mit:
[code]// MSB Register auslesen
uint8_t maxRTD_read_MSB(void)
{
uint8_t buf[3];
buf[0] = 0x01; // Lese-Adresse des MSB-Registers
buf[1] = 0x00; // nicht zwingend notwendig aber sauberer zum Messen
spi_transfer(buf, 2); // Schreiben und gleichzeitiges Auslesen
return (buf[1]); // 8 Bit (MSB) Register als Rückgabewert
}
// LSB Register auslesen
uint8_t maxRTD_read_LSB(void)
{
uint8_t buf[3];
buf[0] = 0x02; // Lese-Adresse des MSB-Registers
buf[1] = 0x00; // nicht zwingend notwendig aber sauberer zum Messen
spi_transfer(buf, 2); // Schreiben und gleichzeitiges Auslesen
return (buf[1]); // 8 Bit (LSB) Register als Rückgabewert
}[/code]
Die Funktion für die Schnittstelle mit dem Transceiver ist gleich der für den MAX31865:
[code]void spi_transceiver (uint8_t *tBuf, uint8_t len) // *pBuf = Pointer
{
int8_t t; // Laufvariable
SCLK = 0;
CS_TRANS = 0; // 0 oder 1?
if(tBuf == 0) return;
while(len) { // len = Anzahl zu übertragenden Bytes
for (t=7; t>=0; t--) { // Durchlauf von i=0 bis i=7
__delay32(100); // Wartezeit
SCLK ^= 1;
// Schreiben
SDO = ((*tBuf) & (1<<t)); // bitweise *pBuf auf 1 prüfen, dann SDO setzen
__delay32(100);
SCLK ^= 1;
// // Einlesen
// if (SDI) {
// *tBuf |= (1<<t); // bitweises ODER: setzt i-tes Bit, auf das pBuf zeigt
// }
// else {
// *tBuf &= ~(1<<t); // Löschung des i-ten Bits, auf das pBuf zeigt
// }
}
tBuf++;
len--;
}
__delay32(100);
CS_TRANS = 1; // 0 oder 1?
}[/code]
Für den Transceiver und dem MAX31865 nutze ich die gleichen Leitungen für Clock, SDO und SDI. CS ist natürlich verschieden.
Für das Senden an den Transceiver nutze ich:
[code]void trans_send (uint8_t MSB_data_max, uint8_t LSB_data_max)
{
uint8_t buf[3];
buf[0] = 0x66; // FW Command
buf[1] = MSB_data_max;
buf[2] = LSB_data_max;
spi_transceiver (buf, 3);
}[/code]
Und in der main-Funktion wird das dann so verwendet:
[code]
MSB_data = maxRTD_read_MSB();
LSB_data = maxRTD_read_LSB();
trans_send(MSB_data, LSB_data); [/code]
Am Empfänger soll dann erst das Ergebnis um einen nach rechts geshiftet werden und die Temperatur berechnet werden.