STM32F407 SPI2 ve ADC kullanımı

Başlatan h_baskent, 25 Ocak 2014, 14:04:16

h_baskent

Merhabalar,
Şöyle bir sorum olacak;
STM32F Discovery kiti ile SPI2 üzerinden Mikrofon kaydı yapan bir programım var (daha doğrusu Audio_playback_and_record başlıklı projeyi kullanıyorum. Bu proje aynı zamanda USB' ye kayıtlı wav dosyasını da kulaklıkla çalıyor.)
Ben çalışmamda  SPI2 üzerinden alınan veriyi direk olarak PC' ye port üzerinden göndermek istedim. Bunun için USART2' yi kullandım. göndermiş olduğum kod şu şekilde;
...
void AUDIO_REC_SPI_IRQHANDLER(void)

   u16 volume;
   u16 app;

  /* Check if data are available in SPI Data register */
  if (SPI_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET)
  {
    app = SPI_I2S_ReceiveData(SPI2);
    InternalBuffer[InternalBufferSize++] = HTONS(app);
      
   //while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
   USART_SendData(USART2,HTONS(app));
    /* Check to prevent overflow condition */
    if (InternalBufferSize >= INTERNAL_BUFF_SIZE)
    {
      InternalBufferSize = 0;
      volume = 50;

      PDM_Filter_64_LSB((uint8_t *)InternalBuffer, (uint16_t *)pAudioRecBuf, volume , (PDMFilter_InitStruct *)&Filter);
     
         Data_Status = 1;       
    }
  }
}
...
fakat USART üzerinden gönderdiğim veri PDM, ben bu veriyi PC' de geliştirdiğim bir programda gözlemleyemiyorum (istediğim gibi çizdiremiyorum veri düzgün değil) bu birinci sorum, acaba PCM' mi dönüşmüş veriyi çizdirebilirim yada PCM sinyalini nasıl elde edebilirim. PDM_Filter_64_LSB fonksiyonunun çıktısını bilmiyorum. elimde .c fonksiyonu yok.yalnızca .h var.

Diğer bir soru ise bu SPI2 8Khz' lik sinyal gönderiyor.  ben ise bu verinin paralelinde ADC1 üzerinden 3 adet  farklı frekansta sinyal alarak aynı sinyalleri de PC' ye göndermek istiyorum.( ses verisi ve diğer üç sinyal aynı veya ayrı paket olarak gönderilebilir)
Yani toplamda ses verisiyle birlikte 4 sinyal fakat üçünün frekansı mesela 50 Hz olmalı.
burada kafamı karıştıran mevzu şudur:
SPI2 ile beraber başka bir Timer tanımlamam mı daha doğru olur (diğer üç sinyal için) ya da SPI2 ses sinyalini alırken 160 veri sesi alsın ardından diğer sinyalleri mi?,
burada sorun şu diğer sinyalleri önce ADC kullanarak dönüştürmem gerekiyor,
özetlersek;
SPI2 den ses sinyalini ADC ile sensorlerden alınan sinyalleri birlikte nasıl alabilirim?  ya da burada SPI2 ile ADC' yi nasıl kullanabilirim.
şimdiden teşekkürler

kahyas

Merhabalar,
Soru sorulalı 4 ay olmuş, muhtemelen halletmişsinizdir ama başkaları için ufak bir bilgi niteliğinde yazmak istedim.

Kullandığın PDM_Filter_64_LSB((uint8_t *)InternalBuffer, (uint16_t *)pAudioRecBuf, volume , (PDMFilter_InitStruct *)&Filter); fonksiyonundaki ikinci parametre fonksiyonun çıkışı olup, girişine verdiğin PDM ses verisini Decimation (64) yapar ve PCM e çevirir.
Eğer bu fonksiyonu çalıştıramıyorsan kendi derleyicine uygun .lib dosyasını eklememişsin demektir.
*.lib dosyasını ST'nin verdiği "STM32F4-DISCOVERY board firmware package"  klasörünün 'Utilities\STM32F4-Discovery' kısmında bulabilirsin.

Anladığım kadarıyla fonksiyonun kullanımını bilmiyorsun. Biraz detaylı anlatırsak;
1. parametre PDM verisini tutan arrayin adresidir.(Array boyutu=16)
2. parametre PCM çıktısını yazacağı adrestir.(Array boyutu=16)
3. parametre bildiğimiz volume'dür
4. parametre ise PDM den PCM e dönüştürmek için kullanacağı filtre structure'ıdır. Bu structure'ı (PDMFilter_InitStruct *) daha önce tanımlamış olman lazım.

kageja

Merhaba h_baskent ,

anladığım kadarıyla yaptığı çalışma mikrofondan ses vrisini alıp seri porttan bilgisayar gönderme, bende sadce mikrofondan veri okuyup bunu internal bi bufferda saklamak istiyorum bu konuda izliyecem yol da bana fikir verebilr yada yardımcı olabilir misin ? bide rica etsem proje kodlarını paylaşırmısın