・・・と書くと簡単に動いたみたいだけれど、かなり試行錯誤した。おもわず勢いでロジアナを買ってしまいたくなるくらい苦労した。
だけれど、オシロスコープだけで頑張った。
近いうちにAnalogDiscoveryを買いたいな。
さて、SPIの設定はこんな感じ。
// SPI2 設定 SPI_InitTypeDef SPI_InitStructure; SPI_StructInit(&SPI_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI2 , &SPI_InitStructure); SPI_Cmd(SPI2,ENABLE);
MPU6500からのデータが正しく読めたかを確認するには、0x75番地のWHO_AM_Iレジスタを読み込めばよい。MPU6500の場合、その結果は0x70になる。
SPIの読み込みは、こんな感じ。
/* MPU6500 リード */ uint16_t mpu6500_rd(SPI_TypeDef *SPIx , uint16_t reg){ volatile uint16_t ret=0; MPU6500_CS_ON(); while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); // 送信バッファが空 SPI_I2S_SendData(SPIx,(reg|0x80)); while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET); // 受信完了待ち ret = SPI_I2S_ReceiveData(SPIx); // dummy read SPI_I2S_SendData(SPIx,0xFF); // dummy write while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET); // 受信完了待ち ret = SPI_I2S_ReceiveData(SPIx); MPU6500_CS_OFF(); return ret; }