Arduino som både SPI slav och master?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Eelector
EF Sponsor
Inlägg: 656
Blev medlem: 3 juni 2003, 23:58:52
Ort: Trollhättan
Kontakt:

Arduino som både SPI slav och master?

Inlägg av Eelector »

Jag har skaffat mig en 9 Degrees of Freedom - Razor IMU.
Det är i princip en 3.3v arduino pro med accerlerometer, gyro och magnetometer på samma kort. ATmegans hårdvaru SPI används som
master för att prata med sensorerna. Problemet jag har har är att jag skulle vilja kunna skicka vidare information från denna modul
via SPI till en annan modul som även den är SPI master. Mastern jag skall skicka till har jag ingen kontroll över. Den skickar data i 400kbit/s. Då och då skickar den ut paket på 28bytes och
klockar samtidigt in 28bytes från en ansluten slav (i detta fall mitt Razor kort)
Går det att lösa kommunikationen med den andra mastern på något sätt med befintliga anslutningsstift utan att löda om på kortet?

Schema finns på http://www.sparkfun.com/datasheets/Sens ... or-v14.pdf
Bilder på kortet finns på http://www.sparkfun.com/products/9623
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Arduino som både SPI slav och master?

Inlägg av Micke_s »

Du behöver nog dra fram lödkolven och komma åt slave select PB2(SS).
Eelector
EF Sponsor
Inlägg: 656
Blev medlem: 3 juni 2003, 23:58:52
Ort: Trollhättan
Kontakt:

Re: Arduino som både SPI slav och master?

Inlägg av Eelector »

Jag antar att PB2 skall jordas när atmegan skall agera slav? Jag vet inte riktigt hur jag skall lösa det iom att den fortfarande måste vara master för att kunna ta emot info från sensorerna...

Går det att använda serieportspinnarna (pd0 och pd1) får någons slags mjukvaru SPI? Jag behöver bara kunna skicka info. Går det att börja sända när klockpulserna kommer och strunta i den inkommande datan (eftersom det bara finns två datapinnar anslutna till JP7-kontakten)
Eelector
EF Sponsor
Inlägg: 656
Blev medlem: 3 juni 2003, 23:58:52
Ort: Trollhättan
Kontakt:

Re: Arduino som både SPI slav och master?

Inlägg av Eelector »

Eller har jag kanske missuppfattat det hela? Den kanske inte alls använder SPI för sensorerna. Jag läste att sparkfuns andra 9DOF-sticka gjorde det, men när jag ser på schemat så verkar det som de olika sensorerna använder olika pinnar. Kan jag helt enkelt använda msio, mosi och sck på J1 porten ifall jag lyckas jorda pb2? :oops:
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Arduino som både SPI slav och master?

Inlägg av Micke_s »

Sensorerna använder I2C.
Problemet med att bara jorda slave select är att du inte kan synca mot spi-mastern. Har inte spi mastern idag någon slave select utdraget så får du se till att du är i sync på något annat sätt.
Går förvisso lösa eftersom spi-master:n skickar ut 28 byte då och då, Du får helt enkelt skriva någon out of sync rutin.

En annan lösning om du inte vill dra en kabel till slave select är skapa en lödbrygga mellan pinne 13 och 14 och mjukvarumässigt dra i pinnen.

Edit: denna lösning hade jag gjort. Du behöver kapa reset, skrapa fram kopparn och dra en kabel från pinne 14. Gör förvisso inget om du skulle löda ihop pinne 12, 13, 14 så länge du inte konfiguerar den till output.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Eelector
EF Sponsor
Inlägg: 656
Blev medlem: 3 juni 2003, 23:58:52
Ort: Trollhättan
Kontakt:

Re: Arduino som både SPI slav och master?

Inlägg av Eelector »

Tack! Jag är nybörjare på uC-programmering och är tacksam för all hjälp jag kan få. :)

Det jag vet om mastern är att den inte är ansluten till några andra slavar. Min arduino kommer vara den enda den pratar med.
I övrigt har jag fått följande info om mastern:

The physical layer uses a Serial Peripheral Interface (SPI) with the following characteristics:
• Three-wire physical connection:
o SPI_MOSI (master out, slave in - from the module to the accessory)
o SPI_MISO (master in, slave out - from the accessory to the module)
o SPI_CLK (from the module to the accessory)
• VDD = 2.1V
• Logic low is less than 30% of VDD
• Logic high is greater than 70% of VDD
• Recommended maximum voltage on any pin is VDD.
• Absolute maximum voltage on any pin is VDD+0.3V.
• Recommended minimum voltage on any pin is 0V.
• Absolute minimum voltage on any pin is -0.3V
• Maximum input pin leakage current 12nA.
• Reset and idle state for the clock and data pins is logic low
• Data is to be sampled on the rising edge of the clock
• Messages are transferred as 8-bit words
• Bytes are transmitted with the most-significant bit first
• Messages may be sent back-to-back (continuous clock)
• Clock rate is 400 kb/s.
The signals on the data lines should be stable at least 10ns before the SPI rising clock edge.

To avoid unnecessary SPI transmissions to an unpowered/absent accessory the module must be able
to detect if the accessory is powered/present.
To achieve this, the module briefly sets the SPI MOSI line to be an input prior to initiating a SPI data
transfer. After 5us, the logical state of the line is read. If high, the module will continue with the SPI
data transfer. If low, the module will not continue with the SPI data transfer.
If the accessory is guaranteed to always be present and powered the accessory may simply pull-up
the SPI MOSI line to VDD to enable SPI data transfers. A pull-up resistor of value 100k may be
suitable (the leakage current and capacitance of the accessory’s input pin must of course be
considered).

Behöver jag löda om kortet även om slaven är ensam att prata med mastern?
Kommer ovanstående att ställa till med några problem i kopplingen mot arduinon?
Jag har skaffat "logic level converter" från sparkfun för att hantera 3.3V <-> 2.1V.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Arduino som både SPI slav och master?

Inlägg av jadler »

JP1 som är omärkt på kortet är ISP, jag skulle behålla den intakt eftersom det underlättar den dag man behöver programmera om firmware och det av någon anledning inte går att göra med Arduino-bootloadern över UART. Det kan ju också vara så att du vill köra helt egen firmware och skippa Arduino-bootloadern, och då är du beroende av ISP för att ändra något.

Du skriver att din SPI-master använder tre trådar (MOSI, MISO, CLK), och alla dessa signaler finns på ISP-kontakten (men serie-klockan kallas där SCK istf CLK). Du behöver inte löda någonting, allt är klart. Mastern är byggd för att prata med en enda slav, antar jag, eftersom den inte använder CS/SS.

Jag skulle sätta en 2x3 stiftlist i JP1, då passar en vanlig programmeringskontakt. Ta en sex trådar bred bit flatkabel och en IDC-kontakt (kabel, hona, sex poler -- exempel) och dra vidare till den andra enheten. Givetvis kan du också välja att löda ihop ett anpassningskort med en kontakt som passar direkt på 2 x 3 stift och sedan dra kabel därifrån.

Vad gäller masterns lösning på att kolla om det finns någon att prata med kan du antingen utnyttja möjligheten och implementera det i mjukvara på din 9DOF Razor IMU, bara svara när du finns där, har kommit igång och har pålitliga data, eller så gör du som de skriver och kopplar in ett pull-up-motstånd.

Väljer du att arbeta med Arduino-konceptet finns färdiga SPI-rutiner att använda. Annars kan du nog lösa det ganska smärtfritt genom att kolla app-notes från Atmel.
Eelector
EF Sponsor
Inlägg: 656
Blev medlem: 3 juni 2003, 23:58:52
Ort: Trollhättan
Kontakt:

Re: Arduino som både SPI slav och master?

Inlägg av Eelector »

Stort tack för detta! :)
Skriv svar