STM32F103 SPI Status sorunu

Başlatan Mucit23, 18 Temmuz 2017, 11:14:07

Mucit23

Selamlar

STM32F103'de SPI ile ilgili bir sorunum var çözemedim. SPI1 ile veri gönderirken SPI->DR registerine bir veri yazdığımda verinin tamamen gidip gitmediğini kontrol etmek için SPI->SR registerini kontrol ediyorum. 1. bit 1 ise verinin tamamı gitmiş olması gerekiyor. Ben DR registerine bir veri yüklediğimde Status registerinin TXE biti hiçbir zaman 0 olmuyor. Dolayısıyla buffer hep boş gibi algılıyorum. Bunun dışında SPI felan çalışıyor fakat Bufferin doluluğunu kontrol edemediğim için sıralı gönderimlerde sorun oluyor.
Dediğim gibi SPI çalışıyor fakat SPIx->DR registerine bir veri yüklediğimde SPIx->SR rehisterinin TXE biti 0 olmuyor. Bu sorun neden olur fikri olan varmı?

JKramer

TXE bit'i, data'nın buffer'dan shift register'a aktarılıp buffer'ın boşaldığı zaman 1 oluyor; dışarı gönderildiğinde değil. TXE, Tx buffer empty anlamındadır diye yazıyor.

Mucit23

#2
Hocam peki verinin tamamen dışarı aktarıldığını nasıl anlarım? Şöyle basit bir döngüm var.

     for (i=0;i<4;i++)                           
     {
         SPI1->DR = data [ i ];
         while ((SPI1->SR & 0x0002) == RESET){} 
     }

Döngü içerisine eğer 1us gibi bir gecikme koyarsam çalışıyor. Diğer türlü veriler birbirine giriyor.

JKramer

Önemli olan data'yı register'a atmadan önce register'ın boş olması. Bu yüzden önce TXE'nin 1 olduğuna, yani register'ın boş olduğuna bakın.

Mucit23

Hocam ilk verdiğim döngüde baudrate değerini arttırdım ve sorun çözüldü. Ama veriyi önce buffere yazıyorum sonra Buffer boşaldımı diye bakıyorum. Mantıken ters bir kere. Sorun çözüldü dediğim ise sadece 72Mhzde çalışan mcu için prescaller değerini 4 yaptığımda oluyor.

Normalde ilk önce buffer boşmu diye bakıyoruz. Sonra boş ise buffere verimizi yüklüyoruz ve işimize bakıyoruz. Skop ile clock  baktığımda 1 byte'lık veriler arasında hiç bekleme olmadığını görüyorum. Karşı tarafta veriyi Shiftregisterlara gönderiyorum.  Bunun sorun olmaması gerekir ama saçmalıyor.

Mucit23

Şu direnç nette satılan ucuz  STM32F103C8 Kartlarında çalışıyorum. Bu kartta sürekli anlamsız GND sorunları yaşıyorum. Daha önce RGB P10 ları sürerkende benzer sorunlar başıma gelmişti. Kart üzerinde birkaç tane GND noktası var. GND aldığım yeri değiştirsem bile panelin çalışması etkileniyordu. Şuandada tek renk P10'lar üzerinde birkaç deneme yapıyorum. Sanırım Yüksek frekans, Uzun flat kablo ve jumper kabloların etkisiyle sinyaller bozuluyor. Yada öyle olduğunu düşünüyorum.


Logic analyser ile baktığımdada sorun olmadığını görüyorum. Fakat nedense Panel bazı clockları atlıyor. 50 tane shift register var ise 50. Shift register'a gitmesi gereken veri 45. Shiftregister'da kalıyor.


Emin olmak için STM32F103 ile P10 paneller arasında bir 74HC245 Buffer entegresi bağlayıp, 3.3V-5V sinyal dönüşümü yapacağım.

mufitsozen

Alıntı yapılan: Mucit23 - 18 Temmuz 2017, 11:14:07
Selamlar

STM32F103'de SPI ile ilgili bir sorunum var çözemedim. SPI1 ile veri gönderirken SPI->DR registerine bir veri yazdığımda verinin tamamen gidip gitmediğini kontrol etmek için SPI->SR registerini kontrol ediyorum. 1. bit 1 ise verinin tamamı gitmiş olması gerekiyor. Ben DR registerine bir veri yüklediğimde Status registerinin TXE biti hiçbir zaman 0 olmuyor. Dolayısıyla buffer hep boş gibi algılıyorum. Bunun dışında SPI felan çalışıyor fakat Bufferin doluluğunu kontrol edemediğim için sıralı gönderimlerde sorun oluyor.
Dediğim gibi SPI çalışıyor fakat SPIx->DR registerine bir veri yüklediğimde SPIx->SR rehisterinin TXE biti 0 olmuyor. Bu sorun neden olur fikri olan varmı?


SPI transmitter 'double-buffered'dir. Bunun anlami bir 'holding register' birde 'shift register' vardir - 'holding register'a birsey yazdiginizda cok kisa bir sure TXE sifir olur ama onda sonra SPI datayi sift registera yukler ve d,sar,ya yollamaya baslar. Bu sure zarfinda 'holding register' yine bos olur ve TXE set olur.

Eger data shiftout islemi bittimi diye gormek isterseniz BUSY indikatorune bakiniz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Mucit23

Evet abi sağolasın. Busy flag ile sorunu çözdüm. Hatta soruna çözüm bulamayınca ST Forumda yazdım senin mesajın aynısı geldi abi:D

Alıntı yapılan: waclawek.jan
The SPI transmitter is double-buffered. It means, that there's a holding register and a shift register - when you write into the holding register, TXE becomes zero for a short moment, but then the SPI machine transfers the data into the shift register and starts to transmit, and at that moment the holding register is empty again and TXE is set again.

If you want to check whether the data shiftout (transmission) has been completed, check the BUSY flag. Read 25.3.7  Status flags chapter in RM0008.

JW

https://community.st.com/thread/42241-stm32f103-spi-sr-txe-bits-always-set

Bu arkadaş ile bir bağlantınız varmı?  :)

Fakat asıl hala devam ediyor. Paneller ile STM32F103 arasına 3.3V->5V dönüşümü sağlamak için 74HC244 bağladım. Çıkış sinyallerini felan osiloskop ile gözlemliyorum. Problem yok görünüyor ama paneldeki SR ler bazı bitleri alamıyor. Clock hızınıda 500kbps'e kadar düşürdüm ama düzelmedi.  Fakat bir sonraki paketi buffer'a yüklemeden önce busy flagını bekleyince düzeldi. Şuan 4.5Mbps ile veri basıyorum problem yok.

mufitsozen

Alıntı yapılan: Mucit23 - 18 Temmuz 2017, 15:55:03

Bu arkadaş ile bir bağlantınız varmı?  :)

Fakat asıl hala devam ediyor. Paneller ile STM32F103 arasına 3.3V->5V dönüşümü sağlamak için 74HC244 bağladım. Çıkış sinyallerini felan osiloskop ile gözlemliyorum. Problem yok görünüyor ama paneldeki SR ler bazı bitleri alamıyor. Clock hızınıda 500kbps'e kadar düşürdüm ama düzelmedi.  Fakat bir sonraki paketi buffer'a yüklemeden önce busy flagını bekleyince düzeldi. Şuan 4.5Mbps ile veri basıyorum problem yok.


O arkadasla serin bir ilkbahar gununde hyde parkda  STM32F10xxx RM0008 Reference Manual okurken tanismistim.

Aaaaa sizdemi SPI transmission bolumunu okuyorsunuz, benimde en cok sevdigim bolum odur. Cok heyecanli demisti.


Orijinal probleminize gelince baska birisi yazar diye bi cevap yazmadim. Bir iki gun daha gecsinde yazan olmazsa onuda soylerim  ;)



Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Mucit23

Abi ikinizde cümleye ayni şekilde girince şaşırdım biraz. Herneyse aklın yolu birmiş

Orjinal sorunu benzer olarak f4discovery ile rgb panelleri sürerkende yaşıyorum. Demekki temelde sürekli yaptığım bir hata var. Gnd ile ilgili olduğunu düşünüyorum ama emin değilim. Bu konuda ne düşünüyorsun abi? 

mufitsozen

#10
Alıntı yapılan: Mucit23 - 18 Temmuz 2017, 21:03:20
Abi ikinizde cümleye ayni şekilde girince şaşırdım biraz. Herneyse aklın yolu birmiş

Orjinal sorunu benzer olarak f4discovery ile rgb panelleri sürerkende yaşıyorum. Demekki temelde sürekli yaptığım bir hata var. Gnd ile ilgili olduğunu düşünüyorum ama emin değilim. Bu konuda ne düşünüyorsun abi? 

Yav SPI TX islemi icin iki register 3 tanede bit var! kac degisik sekilde yazilabilirki?



sorununuzun GND ile ilgili oldugunu dusunmuyorum. Ama devreyi KENDIM osiloskopla bakmadanj boyle yorumlar yapmak dogru olmaz.

Anlattiginiz problem sinyal hatlarinin boyu ve sinyalin hizi ile alakali oldugundan sorunun nedeninin signal transmission line problemi oldugunu dusunuyorum. %80 ihtimalle "reflection" problemidir.

Hat empedansini hesaplayarak (yada deneme yanilma) ile reflection'i azaltabilir yada ortadan kaldirabilirsiniz.

Onerim:
1- sinyalin bozuldugu slavelerde sinyal ile GND arasina termination direnci koyunuz. 150, 120, 100, 81, 68 ohm diye deneyerek kaba hesap ile 120-100ohm sorununuzu cozer diye dusunuyorum ama PCByi gorup kablo tipi, boyu filan bilmeden kesin bir direnc oneremem. Tabii birde slave sayisina gore masterin sinyal hattini surup surememesi durumu olacak onuda datasheetden bakip hesaplamak lazim.

2. onerim masterin sinyal cikisina bir seri direnc ve ona paralel(sinyal ie GND arasina) kucuk bir kapasitor koyarak bir filtre yapmak. Sinyalin hizi, kullandiginiz kablonun stray kapasitansi gibi parametreleri dusunmek lazim bu durumda. Biraz osmanli usulu el terazi goz mizan dersek. Seri direnci 330,270,220 ohm denerdim, paralel direncide kapasitorude 47p, 33p filan.

Bundan daha fazlasi icin devrenin basinda vede osiloskopla olcum vb yapmam lazim.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Mucit23

Teşekkürler abi önerilerini dikkate alacağım