Hallo,
Ich baue eine SPI Schnittstelle zwischen atsam4e8c(master) und
bmi160(slave). Es gibt 5 bmi160 sensoren.
Meine Fragen:
1. Wenn ich chip id aus dem Sensor lese, dann kann ich nur ins
Oszillloskop als 0xd1 sehen. Ich sehe 0xff in SPI_RDR. Warum sehe ich
dieses Verhalten?
2. Es gibt kein Decoder zwischen atsam und bmi160. Datenblatt von atsam
sagt,wir können nur mit 4 slaves ohne decoder sprechen. Wie kann ich mit
5th Sensor sprechen?
3. Wenn ich accelerometer und gyroscope values lesen möchte, kann ich
nur von DATA registers von bmi160 benutzen ? oder muss ich "any motion
interrupt" oder jeder interrupt benutzen?
Bitte verzeihen Sie auf mein Deutsch.
Danke für ihre Hilfe.
Bitte finden Sie die Quelle.
#include "sam.h"
#define NPCS0 PIO_PA11A_NPCS0
#define NPCS1 PIO_PA9B_NPCS1
#define NPCS2 PIO_PA10B_NPCS2
#define NPCS3 PIO_PA22B_NPCS3
#define SPCK PIO_PA14A_SPCK
#define MISO PIO_PA12A_MISO
#define MOSI PIO_PA13A_MOSI
void spi_initialisation(void)
{
Pio *p_pio;
uint32_t pin;
uint32_t ul_sr;
uint32_t i;
//assign port A to the peripheral A and B
p_pio = (Pio *)((uint32_t)PIOA);
pin = SPCK | MISO | MOSI | NPCS0;
ul_sr = p_pio->PIO_ABCDSR[0];
p_pio->PIO_ABCDSR[0] = ~pin & ul_sr;
p_pio->PIO_ABCDSR[0] |= NPCS3|NPCS1|NPCS2;
ul_sr = p_pio->PIO_ABCDSR[1];
p_pio->PIO_ABCDSR[1] = ~(pin | NPCS3|NPCS1|NPCS2) & ul_sr;
p_pio->PIO_PUER = pin; // Enable Pull up
p_pio->PIO_OER = MOSI | SPCK | NPCS0 | NPCS3|NPCS1|NPCS2;
p_pio->PIO_ODR = MISO;
p_pio->PIO_PDR |= pin | NPCS3|NPCS1|NPCS2;
SPI->SPI_CR = SPI_CR_SWRST | SPI_CR_SPIDIS;
//variable peripheral mode.
SPI->SPI_MR = 0x02<<24 | 0x0d<<16 | 0x00<<7 | 0x00<<5 |
SPI_MR_MODFDIS | 0x00<<2 | 0x01<<1 | SPI_MR_MSTR;
// spi clock 1mhz.
//polarity and phase 1.
//16 bits per transfer.
for(i=0;i<4;i++)
SPI->SPI_CSR[i] = 0x02<<24 | 0x0A<<16 | 0x78<<8 | 0x08<<4 | 0x01<<3 |
0x00<<2 | 0x01<<1 | 0x01<<0;
// Enable SPI clock
if ((PMC->PMC_PCSR0 & (0x01u << ID_SPI)) != (0x01u << ID_SPI))
PMC->PMC_PCER0 = 0x01u << ID_SPI;
// SPI enable
SPI->SPI_CR = 0x01 << 0;
}
void spi_transfer(uint16_t byte)
{
uint32_t value;
static uint32_t reg_value;
value = SPI_TDR_TD(byte) | SPI_TDR_PCS(1);
SPI->SPI_TDR = value;
while (!(SPI->SPI_SR & SPI_SR_TXEMPTY)) {}
reg_value = SPI->SPI_RDR;
byte=(uint16_t) (reg_value & SPI_RDR_RD_Msk);
SPI->SPI_CR |= SPI_CR_LASTXFER;
}
int main(void)
{
SystemInit();
spi_initialisation();
uint16_t byte;
byte=0x80ff;
while(1)
{
spi_transfer(byte);
}
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.