STM32 Uart Half Duplex

Başlatan hwdesigner, 02 Kasım 2017, 16:42:17

hwdesigner

Merhaba arkadaşlar.

STM3240vg mikrodenetleyici ile Uart Half Duplex okuma ve yazma yapmak istiyorum. Yazma işini çözdüm ancak okuma konusunda işin içinden çıkamadım. Bu konuda yardımcı olur musunuz acaba

Cemre.

HAL kütüphanesini kullanıyorsanız Half Duplex için fonksiyonları olmalı. Siz nerede takıldınız? Kod paylaşmanız çözüme ulaşmanızı kolaylaştıracaktır...

hwdesigner

Alıntı yapılan: Cemre. - 02 Kasım 2017, 16:47:15
HAL kütüphanesini kullanıyorsanız Half Duplex için fonksiyonları olmalı. Siz nerede takıldınız? Kod paylaşmanız çözüme ulaşmanızı kolaylaştıracaktır...

Pooling ile yapmaya çalışıyorum hocam. Veriyi karşıya gönderiyorum. Gidiyor. Karşıya başka bir veri gönderiyorum (sorgu), cevap veriyor ancak cevabını stm32 ile alamıyorum. İzleme işini araya ftd ile girerek yapıyorum. yani gönderdiğimi, geleni gideni bilgisayardan görüyorum. Nette half duplex uart ile ilgili örnek bulamadım. Örnek üzerinden gitsem çözecek gibiyim. Ancak datasheet ile içinden çıkamadım. Nette örnekte çok az bu konuda yetersiz.

hwdesigner

Bu arada evet Hal kullanıyorum hocam

Cemre.

https://community.st.com/thread/29742
Bir inceler misiniz? Daha önce Half Duplex kullanmamıştım ancak muhtemelen basit bir nüansı atlıyorsunuz...

hwdesigner

Yazdığım kod aşağıdaki gibi

void transmitInstructionPacketandRead()
{
	uint8_t myArray[] = {0xFF};
	//HAL_Delay(1);
	HAL_HalfDuplex_EnableTransmitter(&_huart);
	
	HAL_UART_Transmit_DMA(&_huart,(uint8_t *)myArray,1);
	HAL_UART_Transmit_DMA(&_huart,(uint8_t *)myArray,1);
	
	HAL_UART_Transmit_DMA(&_huart,&Instruction_Packet_Array[0],1);
	HAL_UART_Transmit_DMA(&_huart,&Instruction_Packet_Array[1],1);
	HAL_UART_Transmit_DMA(&_huart,&Instruction_Packet_Array[2],1);	
	
	uint8_t checksum_packet = Instruction_Packet_Array[0] + Instruction_Packet_Array[1] + Instruction_Packet_Array[2];
	
	for (uint8_t i = 3; i <= Instruction_Packet_Array[1]; i++)
	{
		HAL_UART_Transmit_DMA(&_huart,&Instruction_Packet_Array[i],1); // Write Instuction & Parameters (if there are any) to serial
        checksum_packet += Instruction_Packet_Array[i];
	}
  myArray[0]=(~checksum_packet & 0xFF);
	HAL_UART_Transmit_DMA(&_huart,(uint8_t *)myArray,1); // Write low bit of checksum to serial
	
	HAL_HalfDuplex_EnableReceiver(&_huart);
	while(HAL_HalfDuplex_EnableReceiver(&_huart) != HAL_OK)
	{
		
	}
	
	while(HAL_UART_Receive(&_huart,Status_Packet_Array,sizeof(Status_Packet_Array),10000) != HAL_OK)
	{
		
	}
}


Yardımcı olabilirseniz çok sevinirim. Şimdiden teşekkürler.

hwdesigner

@Klein hocam yardımcı olabilir misiniz  :-\

Klein

Hal kütüphanesini tanımıyorum. Bu sebeple doğrudan hal kütüphanesi ile ilgili yardımda bulunamam. Ben genel mantığı anlatayım  siz hal kütüphanesine uyarlayın.

#define PACKTO 1000 // Bu eğer baud hızına ve Timeout değişkeninin eksiltilme hızına bağlı. Yaklaşık 2 byte gelme süresi kadar timeout yeterlidir.


uint8_t RxBuf[100];
uint16_t Timeout;

uint8_t *InPtr = RxBuf;


Usart kesmesi()
{
   *InPtr++ = UsartDataRead();
    TimeOut = PACKTO;
}

void RxPack(void)
{
    int len = InPtr - RxBuf;
    InPtr = RxBuf;
   
  /* Kullanıcı kodu */
    ...
    ...
    ...
}

main ya da timer kesmesi
{
    if(Timeout-- == 0)
             RxPack();
}

hwdesigner

Alıntı yapılan: Klein - 06 Kasım 2017, 12:17:54
Hal kütüphanesini tanımıyorum. Bu sebeple doğrudan hal kütüphanesi ile ilgili yardımda bulunamam. Ben genel mantığı anlatayım  siz hal kütüphanesine uyarlayın.

#define PACKTO 1000 // Bu eğer baud hızına ve Timeout değişkeninin eksiltilme hızına bağlı. Yaklaşık 2 byte gelme süresi kadar timeout yeterlidir.


uint8_t RxBuf[100];
uint16_t Timeout;

uint8_t *InPtr = RxBuf;


Usart kesmesi()
{
   *InPtr++ = UsartDataRead();
    TimeOut = PACKTO;
}

void RxPack(void)
{
    int len = InPtr - RxBuf;
    InPtr = RxBuf;
   
  /* Kullanıcı kodu */
    ...
    ...
    ...
}

main ya da timer kesmesi
{
    if(Timeout-- == 0)
             RxPack();
}

Teşekkürler hocam. Bahsettiğiniz şekilde hallettim. Takılan arkadaşların faydalanması adına zaman bulunca paylaşacağım bu konunun altında.