Forum: Mikrocontroller und Digitale Elektronik SPI-Problem mit LTC6803-1 und STM32, LTC lässt sich nicht beschreiben


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe seit Tagen ein Problem mit einem LTC6803-1 welcher an einem 
STM32F103 per SPI hängt. Die Kommunikation funktioniert eigentlich 
problemlos, allerdings scheint es so als ob der LTC Chip die anfangs 
gesendete Konfiguration nicht übernimmt.

Zum Test wird eine abgewandelte Version hier aus dem Forum verwendet das 
ich zur Übersichtlichkeit etwas gekürzt habe. Dabei wird zu Erst eine 
Konfiguration geschrieben (0x01 + 0xC7 PEC gefolgt von den Config-Bits) 
und anschließend wieder ausgelesen (0x02 + 0xCE PEC gefolgt von den 
ausgelesenen Config-Bits).

Die Kommunikation funktioniert ansich problemlos. Senden und Empfangen 
funktioniert ohne Probleme und auch der Fehlercode (PEC) wird korrekt 
erzeugt und ausgewertet was man auch mit dem Signal Analysator sehen 
kann.

Allerdings werden beim Auslesen des LTC (ab X1) statt der geschriebenen 
Daten nur Nullen ausgegeben, was jedoch mit dem PEC-Code 0x5F zusammen 
passt, eine schlechte Datenverbindung kann ich also ausschließen. Auch 
diverse Zeitverzögerungen zwischen, vor oder nach den CS kann ich 
ausschließen da ich mitlerweile so gut wie jede Variation durchprobiert 
habe und auch ich Datenblatt keine weiteren Hinweise finden kann.

Hat jemand eine Erklärung hierfür?

von Chris (Gast)


Lesenswert?

Programmcode vergessen -.-
1
#include "stm32f1xx_hal.h"
2
#include "stm32f1xx_hal_conf.h"
3
4
RCC_OscInitTypeDef RCC_OscInitStruct;
5
RCC_ClkInitTypeDef RCC_ClkInitStruct;
6
GPIO_InitTypeDef GPIO_InitStruct;
7
SPI_HandleTypeDef hspi1;
8
9
10
11
uint8_t CRC8_Table[256];    // 8-bit table for PEC calc
12
13
void CRC8_Init(void)
14
{
15
  uint16_t i, j;
16
  uint8_t crc;
17
  for (i = 0; i < 256; i++)
18
  {
19
    crc = i;
20
    for (j = 0; j < 8; j ++)
21
    {
22
      crc = (crc << 1) ^ ((crc & 0x80) ? 0x07 : 0);
23
    }
24
    CRC8_Table[i] = crc & 0xFF;
25
  }
26
}
27
28
29
int main(void)
30
{
31
32
  // Reset of all peripherals, Initializes the Flash interface and the Systick
33
  HAL_Init();
34
35
  // Configure external quarz as clock
36
  RCC_OscInitTypeDef RCC_OscInitStruct;
37
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
38
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
39
  RCC_OscInitStruct.HSICalibrationValue = 16;
40
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
41
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
42
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;
43
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
44
45
46
47
  //-------------------------------------------------------------------
48
  // Init SPI
49
  //-------------------------------------------------------------------
50
  // Peripheral clock enable
51
  __SPI1_CLK_ENABLE();
52
  __GPIOA_CLK_ENABLE();
53
  __GPIOB_CLK_ENABLE();
54
55
  hspi1.Instance = SPI1;
56
  hspi1.Init.Mode = SPI_MODE_MASTER;
57
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
58
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
59
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
60
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
61
  hspi1.Init.NSS = SPI_NSS_SOFT;
62
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
63
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
64
  hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
65
  HAL_SPI_Init(&hspi1);
66
67
  // SPI1 GPIO Configuration
68
  // PA5     ------> SPI1_SCK
69
  // PA6     ------> SPI1_MISO
70
  // PA7     ------> SPI1_MOSI
71
  // PB6     ------> SPI_1 CS (LTC6803_CS_PIN)
72
73
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
74
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
75
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
76
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
77
78
  GPIO_InitStruct.Pin = GPIO_PIN_6;
79
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
80
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
81
  GPIO_InitStruct.Pull = GPIO_PULLUP;
82
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
83
84
  // set CS to high (disable)
85
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
86
87
  GPIO_InitStruct.Pin = GPIO_PIN_6;
88
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
89
  GPIO_InitStruct.Pull = GPIO_PULLUP;
90
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
91
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
92
93
94
  // Calculates the table for PEC data
95
  CRC8_Init();
96
97
98
  //-------------------------------------------------------------------
99
  // Write Configuration
100
  //-------------------------------------------------------------------
101
102
  // prepare WRCFG + WRPEC
103
  uint8_t send_buffer[9] = {0x01, 0xc7}; // WRCFG + WRPEC
104
105
  // set CS to low (enable)
106
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
107
108
  // send WRCFG + WRPEC
109
  HAL_SPI_Transmit(&hspi1, send_buffer, 2, 1);
110
111
  // prepare CFG1R... + CFGPEC
112
  send_buffer[0] = 0x11; // CFG1R0
113
  send_buffer[1] = 0x00; // CFG1R1
114
  send_buffer[2] = 0x00; // CFG1R2
115
  send_buffer[3] = 0x00; // CFG1R3
116
  send_buffer[4] = 0x00; // CFG1R4
117
  send_buffer[5] = 0x00; // CFG1R5
118
  send_buffer[6] = 0x3B; // CFGPEC
119
120
  // send CFG1R... + CFGPEC
121
  HAL_SPI_Transmit(&hspi1, send_buffer, 7, 1);
122
123
  // set CS to high (disable)
124
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
125
126
  //-------------------------------------------------------------------
127
  // Try to read Configuration into receive_Buffer
128
  //-------------------------------------------------------------------
129
130
  // Read LTC6803 configuration
131
  uint8_t receive_Buffer[7] = { 0 };
132
  // preapare RDCFG + RCPEC
133
  send_buffer[0] = 0x02; // RDCFG
134
  send_buffer[1] = 0xCE; // RCPEC
135
  send_buffer[2] = 0; // nothing to send, just receive
136
  send_buffer[3] = 0; // nothing to send, just receive
137
  send_buffer[4] = 0; // nothing to send, just receive
138
  send_buffer[5] = 0; // nothing to send, just receive
139
  send_buffer[6] = 0; // nothing to send, just receive
140
141
  // set CS to high (disable)
142
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
143
144
  // send RDCFG + RCPEC and receive CFG1R... and CFGPEC
145
  HAL_SPI_TransmitReceive(&hspi1, send_buffer, receive_Buffer, 9, 1);
146
147
  // set CS to high (disable)
148
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
149
150
  while (1) {}
151
}

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.