Manekken
13.05.2016, 09:57
Hallo liebe Roboternetz Gemeinde.
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/ece476...
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:
#include "stdint.h"
#include "inttypes.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_spi.h"
#include "spiFunctions.h"
void Delay(volatile uint32_t nCount)
{
while(nCount--)
{
}
}
void initSPI(void) {
SPI_InitTypeDef SPI_InitTypeDefStruct;
SPI_InitTypeDefStruct.SPI_BaudRatePrescaler=SPI_Ba udRatePrescaler_2;
SPI_InitTypeDefStruct.SPI_Direction=SPI_Direction_ 2Lines_FullDuplex;
SPI_InitTypeDefStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitTypeDefStruct.SPI_DataSize=SPI_DataSize_8b ;
SPI_InitTypeDefStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitTypeDefStruct.SPI_FirstBit=SPI_FirstBit_MS B;
SPI_InitTypeDefStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitTypeDefStruct.SPI_CPHA=SPI_CPHA_2Edge;
SPI_Init(SPI1, &SPI_InitTypeDefStruct);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
SPI_Cmd(SPI1, ENABLE);
}
void initReset(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void init1(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// Clock Enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Config PD12 als Digital-Ausgang
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void init2(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// Clock Enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Config PD14 als Digital-Ausgang
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void)
{
init1();
init2();
initSPI();
initReset();
Delay(500000);
GPIO_SetBits(GPIOA,GPIO_Pin_13); //Soll den RESET starten
Delay(500000);
GPIO_ResetBits(GPIOA,GPIO_Pin_13); //Soll den RESET beenden
while(1) { //hier nur zum testen lasse ich eine LED blinken
Delay(900000);
GPIOD->ODR ^= GPIO_Pin_12; // PD12 toggeln
}
}
Also wie gesagt. Danke schonmal wer bis hier gelesen hat!
Grüße,
Manekken.
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/ece476...
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:
#include "stdint.h"
#include "inttypes.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_spi.h"
#include "spiFunctions.h"
void Delay(volatile uint32_t nCount)
{
while(nCount--)
{
}
}
void initSPI(void) {
SPI_InitTypeDef SPI_InitTypeDefStruct;
SPI_InitTypeDefStruct.SPI_BaudRatePrescaler=SPI_Ba udRatePrescaler_2;
SPI_InitTypeDefStruct.SPI_Direction=SPI_Direction_ 2Lines_FullDuplex;
SPI_InitTypeDefStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitTypeDefStruct.SPI_DataSize=SPI_DataSize_8b ;
SPI_InitTypeDefStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitTypeDefStruct.SPI_FirstBit=SPI_FirstBit_MS B;
SPI_InitTypeDefStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitTypeDefStruct.SPI_CPHA=SPI_CPHA_2Edge;
SPI_Init(SPI1, &SPI_InitTypeDefStruct);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
SPI_Cmd(SPI1, ENABLE);
}
void initReset(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void init1(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// Clock Enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Config PD12 als Digital-Ausgang
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void init2(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// Clock Enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Config PD14 als Digital-Ausgang
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void)
{
init1();
init2();
initSPI();
initReset();
Delay(500000);
GPIO_SetBits(GPIOA,GPIO_Pin_13); //Soll den RESET starten
Delay(500000);
GPIO_ResetBits(GPIOA,GPIO_Pin_13); //Soll den RESET beenden
while(1) { //hier nur zum testen lasse ich eine LED blinken
Delay(900000);
GPIOD->ODR ^= GPIO_Pin_12; // PD12 toggeln
}
}
Also wie gesagt. Danke schonmal wer bis hier gelesen hat!
Grüße,
Manekken.