Forum: Mikrocontroller und Digitale Elektronik Frage bzgl. serial I/O Verbindungen beim STM32F401C


von Kevin P. (manekken)


Lesenswert?

Guten Morgen liebe Mikrocontroller Gemeinde,
ich habe eine Frage bzgl. der Realisierung einer einfachen I/O (2 
Leitungen) Verbindung eines ADNS a2610 Maussensors mit einem STM32F401C 
Board. Ich habe zuvor schonmal einen Maussensor über SPI (4 Leitungen) 
angebunden, was auch funktioniert hat. Allerdings finde ich zu so 
einfachen serial I/O Verbindungen absolut keine Tutorials im Internet, 
welche mir helfen könnten das Ganze zu realisieren. Ich bin leider bei 
weitem nicht tief genug in der Materie um das Ganze selbst zu 
programmieren.

Der a2610 Sensor verwendet eine SCK und eine SDIO Line. Read und Write 
wird ganz klassisch über das MSB festgelegt. Beim Übertragen liest der 
a2610 bei steigenden Flanken den SDIO Pegel und der STM32F4 soll den 
SDIO Pegel bei fallender SCK Flanke ändern. Meiner Meinung nach ganz 
klassisch.

Ich hab schon viel im Bezug auf SDIO beim STM32F4 gelesen. Allerdings 
finde ich nur Hilfestellungen bzgl. der Anbindung von SD-Karten. Dann 
verwenden viele für serielle Verbindungen dieses UART, welches aber mehr 
Leitungen benötigt. Die einzige serielle Verbindung für welche ich 
Tutorials gefunden habe und welche nur 2 Leitungen benötigt, ist I2C. 
Allerdings hab ich keine Ahnung ob das kompatibel ist.

Was ich brauche ist eine ganz simple Initialisierung meiner beiden Pins 
die ich brauche und einfache Read und Write Funktionen. Vielleicht hat 
jemand geeigneten Code der mir helfen könnten oder die Zeit mir ganz 
grob das zu skizzieren wie ich vorgehen muss. Ich nehme auch sehr gerne 
Tipps an, wie ich weitermachen könnte.

Über SDIO habe ich mich schon etwas schlau gemacht und eine Initfunktion 
geschrieben. Falls es überhaupt mit SDIO funktioniert, habe ich jedoch 
keinen Plan wie ich die Read und Write Funktionen schreiben könnte, ohne 
vorgefertigte zu verwenden. Es müssen ja auch alle Timings eingehalten 
werden.

Vielen Dank schonmal fürs Lesen bis hierher! Ich hoffe jemand hat die 
Zeit und Muse mir etwas zur Hand zu gehen!

Hier meine SDIO Init:
1
#include <stdio.h>
2
#include "stdint.h"
3
#include "inttypes.h"
4
#include "stm32f4xx_gpio.h"
5
#include "stm32f4xx_rcc.h"
6
#include "stm32f4xx_spi.h"
7
#include "stm32f4xx.h"
8
#include "stm32f4xx_sdio.h"
9
10
/* relevante a2610 Register */
11
12
#define sensorConfig           (0x00)
13
#define sensorStatus           (0x01)
14
#define deltaY       (0x02)
15
#define deltaX       (0x03)
16
#define SQUAL       (0x04)
17
#define MaxPixel     (0x05)
18
#define MinPixel     (0x06)
19
#define PixelSum     (0x07)
20
#define picture     (0x08)
21
#define ShutterMSB     (0x09)
22
#define ShutterLSB     (0x0A)
23
#define InverseProduct           (0x11)
24
25
void initSDIO(void) {
26
  uint32_t tempreg;
27
  GPIO_InitTypeDef GPIO_InitStruct;
28
29
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
30
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
31
32
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
33
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
34
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
35
36
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
37
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
38
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz;
39
  GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
40
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
41
42
  GPIO_Init(GPIOC, &GPIO_InitStruct);
43
44
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
45
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
46
47
  GPIO_Init(GPIOC, &GPIO_InitStruct);
48
49
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
50
  GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
51
52
  GPIO_Init(GPIOD, &GPIO_InitStruct);
53
54
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);
55
56
  tempreg=0;
57
  tempreg|=SDIO_CLKCR_CLKEN;
58
  tempreg|=(uint32_t)0x76;
59
60
  SDIO->CLKCR=tempreg;
61
  SDIO->POWER=0x03;
62
}
63
64
int main(void)
65
{
66
  initSDIO();
67
68
  while(1) {
69
70
  }
71
}

Grüße,
Manekken!

von Jim M. (turboj)


Lesenswert?

> Ich hab schon viel im Bezug auf SDIO beim STM32F4 gelesen

Vorsicht: Unter SDIO versteht man meistens die Kommunikation von SD 
Karten bzw deren Kommunikations-Schnittstelle. Die hat aber mehr 
Leitungen als nur SCK und SDIO.

Dein Maussensor klingt eher nach sowas wie halb-duplex SPI mit 2 
Leitungen, das ist was anderes. Ich glaube nicht das die STM32F4 sowas 
direkt in Hardware können - also bräuchte man Software SPI.

von Kevin P. (manekken)


Lesenswert?

Hi danke schonmal für die Antwort. Aber ich dachte immer SPI braucht 
mindestens 4 Leitungen. Also NCS, SCLK, MOSI und MISO. Wie funktioniert 
dann das andere?

Oder isses für meinen Einsatzbereich praktikabler einfach alles selbst 
zu programmieren? Also quasi keine Alternate Functions verwenden, 
sondern die beiden benötigten PINs einfach als GPIO Pins definieren und 
initialisieren und dann alles manuell durchzuführen.
Für eine write Funktion dann beispielsweise Bit für Bit zu übertragen 
und parallel immer den PIN am SCK richtig zu schalten. Ich bräuchte halt 
dann in den Funktionen die Möglichkeit aus meinen uint8 bytes die 
einzelnen Bits der Reihe nach durchzuschieben. Das habe ich leider alles 
schon ewig nichtmehr gemacht und hab keinen Plan mehr wie man da 
rangeht.

Grundsätzlich bräuchte ich doch dann 3 Funktionen:
1
/* Eine Init Funktion */
2
void mausSensorInit(void){
3
  /*Alle GPIO Pins initialisieren, Clocks anschalten etc pp*/
4
  /*SCK standartmäßig auf low setzen*/
5
  /*Sensor resetten*/
6
  /*Sensor auf perma awake setzen*/
7
}
8
9
/*Die Read und Write Funktionen*/
10
11
void mausSensorWrite(uint8 address, uint8 data){
12
  /*1. IO Pin auf high setzen -> MSB als Signal zum schreiben*/
13
  /*2. 7 Bit Adresse mithilfe einer kleinen Schleife übertragen, wobei SCK immer zyklisch geändert wird*/
14
  /*3. 8 Bit Daten mithilfe einer kleinen Schleife übertragen, wobei SCK immer zyklisch geändert wird*/
15
  /*4. Eine kleine Pause einlegen*/
16
}
17
uint8 mausSensorRead(uint8 adress){
18
  /*1. IO Pin auf low setzen -> MSB als Signal zum lesen*/
19
  /*2. 7 Bit Adresse mithilfe einer kleinen Schleife übertragen, wobei SCK immer zyklisch geändert wird*/
20
  /*3. Eine 100us Pause einlegen*/
21
  /*4. 8 Bit Daten über den IO Pin zyklisch empfangen*/
22
}

Wäre der Ansatz prinzipiell richtig?

Grüße!

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.