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!