2015年8月27日木曜日

MPU6500 動く

3軸ジャイロ+3軸加速度センサMPU-6500をSTM32F4のSPI接続で動作確認をした。

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

2015年8月16日日曜日

ADC1とADC2とADC3

STM32F405とSTM32F407の64ピン版と100ピン版のADCについて一覧にしてみた。
ADC3が思いのほか、使えるチャンネルが少ない。

ADC1 ADC2 ADC3
ADC_ch0
ADC_ch1
ADC_ch2
ADC_ch3
ADC_ch4 ×
ADC_ch5 ×
ADC_ch6 ×
ADC_ch7 ×
ADC_ch8 ×
ADC_ch9 ×
ADC_ch10
ADC_ch11
ADC_ch12
ADC_ch13
ADC_ch14 ×
ADC_ch15 ×