NRF24L01+ RX Mod ve Flush Sorunu (ÇÖZÜLDÜ)

Başlatan STM32, 08 Ağustos 2018, 23:45:51

STM32


Düzenleme: Sorun çözüldü. Komutlar için header file içerisindeki tanımlamalar şu şekildeydi : #define COMD_XX_XX (uint8_t) 0x00
Payload okuma ve FIFO temizlemek için kullandığım komutlarda ise pointer ile ilgili bir hata yapıyordum.

HAL_SPI_Transmit(&hspi1, (uint8_t*)COMD_XX_XX, 1, 1 );
(uint8_t*)COMD_XX_XX --> Bütün sorun bundan kaynaklanıyordu.

.c dosyası içinde komutlar için yeniden global değişkenler tanımladım ve
HAL_SPI_Transmit(&hspi1, &COMD_XX_XX, 1, 1 );
Bu şekilde bir düzenleme yaptım.

Sorun çözüldü.




Merhabalar.
Bir süredir NRF24L01+ için kütüphane oluşturmaya çalışıyorum. Ancak bir tane sorun ile karşı karşıyayım ve çözüm bulamadığım için yardımlarınızı bekliyorum. STM32F103C8T6 kullanıyorum.



Sorunum ise RX Mod ile ilgili.

Gönderici olarak Arduino kullanıyorum ve alıcı kısmında ise STM32F103C8T6 var.

Her iki tarafta ;
1. Aynı adres üzerinden haberleşiyorlar
2. Aynı CRC uzunluğuna sahipler
3. Enhanced Mod kullanmıyor
4. Aynı adres uzunluğuna sahipler
5. Aynı payload uzunluğuna sahipler
6. Aynı hızda haberleşiyorlar

RX Mod için kurduğum algoritma şu şekilde.
1. CE=1
2. STATUS registerı içinde RX_DR biti, RX FIFO'ya veri geldiğini bildiriyor. Bu biti kontrol et ve veri gelmişse CE=0 (IRQ pinini kullanmıyorum)
3. Datasheet te belirtilen R_RX_Payload komutu ile gelen veriyi bir değişkene al
4.  RX FIFO yu temizle
5. STATUS yazmacındaki RX_DR bitini temizlemek için o bite 1 yaz.
6. Döngüyü tekrarla

Ancak sonuç alamıyorum.

Kod:



void RX_Mode()
{

ChipEnable_high(); // CE=1

//RX_DR bitini kontrol et. Veri gelene kadar döngüde kal.
while(check)
{
ReadRegister(REG_STATUS,1);

if( (reg_data & 0x40) == 0x40 ){check = false;}
}


ChipEnable_low(); // CE=0

csn_low(); //CSN=0, veri okumak icin
HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)COMD_R_RX_PAYLOAD, &received_data, 1, 150); // FIFO daki veriyi oku
csn_high(); // CSN=1

Flush_RX(); //RX FIFO temizle

// RX_DR bitini temizle. (1 yaz)
ReadRegister(REG_STATUS,1);
data2write = ( reg_data | 0x40);
WriteRegister(REG_STATUS,data2write,1);

//Okunan degeri ekrana bastir.
CDC_Transmit_FS(&received_data,1); // Print the received data out.

}




Koddaki kontrol için koyduğum while döngüsünü iptal ettğimde ise sürekli olarak 0x0E verisini okuyorum.

Datasheet te RX_DR biti için şöyle denilmiş : Data Ready RX FIFO interrupt. Asserted when new data arrives RX FIFO. Write 1 to clear bit.
"Veri hazır kesmesi. RX FIFO ya yeni veri geldiğinde sürülür. Biti temizlemek için 1 yazın."


Her türlü yardım ve öneri kıymetlidir. Teşekkürler.

Datasheet te sayfa 21 de verilen şematik ektedir.
Sayfa 54 te ise register map mevcut.


Öteki yaşadığım sorun ise Flush komutu ile ilgili. TX veriyi gönderiyor ve RX kısmında registerları kontrol ediyorum. Verinin geldiğini anlıyor ve RX_DR bitini 1 yapıyor ardından RX_FIFO_STATUS registerını değiştiriyor. TX'i devre dışı bırakıyorum ve RX kısmında FLUSH_RX komutu çalıştırıyorum ancak; RX_DR biti ve RX_FIFO_STATUS halen aynı kalıyor. Halen FIFO'da veri var olarak gösteriyor.



void Flush_RX()
{
csn_low();
HAL_SPI_Transmit(&hspi1, (uint8_t *)COMD_FLUSH_RX, 1, 150);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
  csn_high();
}



askin

Bu aralar bende NRF24 ile uğraşıyorum, datasheet registerler içinde boğulmaktansa tümden gelim yöntemini kullanıp, çalışan sistemi parçalayıp anlamaya çalışıyorum, internette en fazla döküman ve açıklama arduino için yazılmış çizilmiş.

2-3 library hazırlanmış fakat ben sadece birini çalıştırabildim, o da SPI kütüphanesini zaptedip başka bir cihazla haberleşmeye izin vermiyor vs. vs. gönlümden geçen 16f628 le çalıştırmak ama insan resmen boğuluyor.

https://forum.arduino.cc/index.php?topic=352534.0

linkindeki arkadaş kütüphaneden bağımsız olarak çalıştırmayı başarmış, sorunun cevabı muhtemelen bu linkte, detaylı incelemek üzere kaydetmiştim, bir ara transa geçip üzerinde çalışmam gerekiyor. Çalışmalarını bizimle paylaşırsan sevinirim.

STM32

Konu başlığında ve içeriğinde CONFIG registerına bazı değerleri yazamadığımı söylemiştim lakin şimdi denedim ve yazabiliyorum. Tamamen benim dikkatsizliğimden kaynaklanmış bir yanlış anlaşılma. Örneğin CONFIG registerına 0x08 yazdırıp okuduğum zaman ekrana ascii karşılığı olarak basıyor. 0x08 BackSpace e karşılık geliyor ve dikkatsizliğim yüzünden bunu sanki çalışmıyormuş gibi algıladım. Yani CONFIG registerı ile ilgili bir problemim yok. Şu anda sorunum RX Mod ile ilgili.

Konu başlığında ve içerğinde düzeltmeyi bundan ötürü yaptım.

STM32

#3
Merhaba. Kod üzerinde bazı değişiklikler yaptım. Şu an için tek taraflı haberleşme için uğraşıyorum.
Verici 0x36 verisi gönderiyor. Ancak alıcıdan ise okuduğum değer STATUS registerının RX_DR biti aktif olmuş hali (0x42) oluyor ardından sürekli olarak STATUS registerından 0x02 verisini okuyorum. Yani gelen veriyi göremiyorum.

Kod:


void RX_Mode()
{
ChipEnable_high(); // receiver veri beklemeye başlıyor

while( !(IRQ_Pin_Is_Low() && RXDR_Bit_Is_Set()) ); // IRQ pini low olana ve RX_DR biti 1 olana kadar bekle

ChipEnable_low(); // veri ulaşmışsa CE=0 yap.

ReadPayload(); // gelen veriyi oku

ClearInterrupts(); // kesme bitlerini temizle

//while döngüsü, FIFO da kalan veri var mı diye bakıp varsa okumak için kullanılıyor
while(check)
{

ReadRegister(REG_FIFO_STATUS,1);

if((reg_data & 0x01)==0x00)
{
ReadPayload();
ClearInterrupts(); // kesme bitlerini temizle
}
else
check = false;
}

Flush_RX(); //Fifo yu temizle
check = true;

}





void ReadPayload()
{
csn_low(); //CSN=0
HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)COMD_R_RX_PAYLOAD, &received_data ,1, 1500); // READ RX FIFO
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
CDC_Transmit_FS(&received_data,1); // okunan değeri yazdır
csn_high(); // CSN=1
}


Powered by EzPortal