Forum: Mikrocontroller und Digitale Elektronik Anbindung eines ADNS-3080 per SPI an STM32F401C-DISCO


von Manekken (Gast)


Lesenswert?

Hallo liebe Mikrocontrollergemeinde.
Und zwar bin ich momentan dabei einen ADNS-3080 Maussensor an mein 
STM32F401C-DISCO Board anzubinden. Und zwar über SPI.

Über folgenden Link kann man das Datenblatt des Sensors finden:
https://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2009/ncr6_wjw27/ncr6_wjw27/docs/adns_3080.pdf

Die Spannungsversorgung funktioniert zuverlässig. Wurde alles per 
Multimeter ausgemessen. An allen relevanten Pins habe ich 3.3V gemessen.

Verbunden habe ich alles folgendermaßen:
PA13 - RESET (zum resetten des Sensors)
PA15 - NCS
PA5  - SCLK  (SPI1)
PA6  - MISO  (SPI1)
PA7  - MOSI  (SPI1)

Ich habe die Verbindungskabel direkt am Sensor verlötet. Die andere 
Seite habe ich mich Steckern versehen und auf der Board gesteckt. Was 
ich aus dem Datenblatt herauslesen konnte ist folgendes:
Zuerst muss die Spannungsversorgung auf 3.3V sichergestellt werden. Dann 
muss der RESET Pin von low auf high gezogen werden und dann wieder auf 
low. Allerdings passiert nach diesem Vorgang absolut nichts. Eigentlich 
muss dann die LED_CRTL eine Spannung aufweisen. Was mir aufgefallen ist:
Entferne ich die Verbindung zum RESET Pin, kann ich den PA13 auf low 
(0V) und high (~3V) ziehen. Der Code funktioniert also. Ist nun die 
Verbindung vorhanden lande ich bei low auf ca. 1.38V und bei high wieder 
auf ca. 3V. Ich verstehe nicht wo diese Spannung herkommt wo ich doch 
PA13 auf low gezogen habe.
Vielleicht hat ja jemand Erfahrung mit diesem Sensor oder vielleicht hab 
ich auch im Datenblatt etwas wichtiges nicht kapiert. Ich würde mich 
dementsprechend über Hilfe wirklich freuen!

So jetzt noch mein bisheriger Code:
1
#include "stdint.h"
2
#include "inttypes.h"
3
#include "stm32f4xx_gpio.h"
4
#include "stm32f4xx_rcc.h"
5
#include "stm32f4xx_spi.h"
6
#include "spiFunctions.h"
7
8
9
void Delay(volatile uint32_t nCount)
10
{
11
  while(nCount--)
12
  {
13
  }
14
}
15
void initSPI(void) {
16
    SPI_InitTypeDef SPI_InitTypeDefStruct;
17
18
    SPI_InitTypeDefStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;
19
    SPI_InitTypeDefStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
20
    SPI_InitTypeDefStruct.SPI_Mode=SPI_Mode_Master;
21
    SPI_InitTypeDefStruct.SPI_DataSize=SPI_DataSize_8b;
22
    SPI_InitTypeDefStruct.SPI_NSS=SPI_NSS_Soft;
23
    SPI_InitTypeDefStruct.SPI_FirstBit=SPI_FirstBit_MSB;
24
    SPI_InitTypeDefStruct.SPI_CPOL=SPI_CPOL_High;
25
    SPI_InitTypeDefStruct.SPI_CPHA=SPI_CPHA_2Edge;
26
27
    SPI_Init(SPI1, &SPI_InitTypeDefStruct);
28
29
    GPIO_InitTypeDef GPIO_InitStruct;
30
31
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
32
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
33
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
34
    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
35
    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
36
37
    GPIO_Init(GPIOA, &GPIO_InitStruct);
38
39
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;
40
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
41
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
42
    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
43
    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
44
45
    GPIO_Init(GPIOA, &GPIO_InitStruct);
46
47
48
49
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
50
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
51
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
52
53
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
54
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
55
56
    SPI_Cmd(SPI1, ENABLE);
57
}
58
59
void initReset(void) {
60
61
    GPIO_InitTypeDef GPIO_InitStructure;
62
63
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
64
65
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
66
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
67
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
68
    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
69
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
70
71
    GPIO_Init(GPIOA, &GPIO_InitStructure);
72
}
73
74
void init1(void) {
75
  GPIO_InitTypeDef  GPIO_InitStructure;
76
77
  // Clock Enable
78
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
79
80
  // Config PD12 als Digital-Ausgang
81
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
82
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
83
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
84
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
85
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
86
  GPIO_Init(GPIOD, &GPIO_InitStructure);
87
}
88
89
void init2(void) {
90
  GPIO_InitTypeDef  GPIO_InitStructure;
91
92
  // Clock Enable
93
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
94
95
  // Config PD14 als Digital-Ausgang
96
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
97
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
98
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
99
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
100
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
101
  GPIO_Init(GPIOD, &GPIO_InitStructure);
102
}
103
104
105
106
int main(void)
107
{
108
  init1();
109
  init2();
110
  initSPI();
111
  initReset();
112
113
  Delay(500000);
114
  GPIO_SetBits(GPIOA,GPIO_Pin_13); //Soll den RESET starten
115
  Delay(500000);
116
  GPIO_ResetBits(GPIOA,GPIO_Pin_13); //Soll den RESET beenden
117
118
  while(1) { //hier nur zum testen lasse ich eine LED blinken
119
    Delay(900000);
120
    GPIOD->ODR ^= GPIO_Pin_12; // PD12 toggeln
121
  }
122
}

Also wie gesagt. Danke schonmal wer bis hier gelesen hat!

Grüße,
Manekken.

von Unregistriert (Gast)


Lesenswert?

Manekken schrieb:
> Verbunden habe ich alles folgendermaßen:
> PA13 - RESET (zum resetten des Sensors)
> PA15 - NCS
> PA5  - SCLK  (SPI1)
> PA6  - MISO  (SPI1)
> PA7  - MOSI  (SPI1)


Die Frage hast Du doch schon im Roboternetz gestellt. Schreib das doch 
in Deinen Post rein.

http://www.roboternetz.de/community/threads/69206-Anbindung-eines-ADNS-3080-per-SPI-an-STM32F401C-DISCO

Hier nochmal meine Antwort:

Die Pins PA13-PA15 sind bei Power-On auf JTAG konfiguriert.
Hast Du das in der Software deaktiviert? Scheint mir nicht so.
Check das mal und benutze andere Pins. Zur Software kann ich nichts 
sagen, ich benutze diese üblen ST-Bibliotheken nicht und programmiere 
die Register direkt. Das macht viel weniger Probleme und man versteht, 
was passiert...

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.