・・・と書くと簡単に動いたみたいだけれど、かなり試行錯誤した。おもわず勢いでロジアナを買ってしまいたくなるくらい苦労した。
だけれど、オシロスコープだけで頑張った。
近いうちに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;
}
0 件のコメント:
コメントを投稿