SWD/JTAG ile ilişkili pinleri kullanırken nelere dikkat etmeliyim?

Başlatan Erhan YILMAZ, 30 Ocak 2012, 21:50:02

Erhan YILMAZ

Merhabalar başlıkta da belirttiğim gibi soru net. Lpc1343 ile uğraşıyordum ssp modülünü çalıştırayım dedim başlamadan fark ettim spi pinleri SWD pinleri ile ortak kullanılıyor. Çoğu denetleyicilerde bu şekilde SWD/JTAG birimleri seri programlama arayüzleri olduğu için SPI birimleri ile aynı pinleri paylaşıyor. Sormak istediğim lpc1343 olsun yada herhangi bir denetleyici olsun bu pinleri kullanırken nelere dikkat etmeliyim. Örneğin bu şekilde hem SWD programlama soketi bulunan hemde aynı spi birimini kullanarak lcd süren bi kart tasarladığımda bu birimlerin birbirini etkilememesi için donanımda veya yazılımda ne gibi önlemler almak gerekir?

haydarpasamikro

MISO için PIO0_8
MOSI için PIO0_9 aynı zamanda SWO
SCK için PIO2_11
SWC için PIO0_10 portu.

LOC kaydediciler ile bazı port fonksiyonlarını farklı portlara atayabiliyoruz.
IOCON_SCK0_LOC  içinde CSKLOC alternatif port lokasyon portunu değiştirerek çözülebilir. Yani PIO2_11 olarak atayabiliriz.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Klein

Jtag, swd gibi pinleri mümkün olduğunca IO olarak kullanmamaya çalışırım.  Geçenlerde STM32F4 Discovery ile uğraşırken  farkında olmadan SWD pinini kullanışım. Programda bir hata oldu. Bir daha program atamadım.  Sonra @bunalmıs'ın örneklerindeki SYSINIT rutinlerini kullandığımı hatırladım. Programın başında bir for döngüsü var. Reset attığım anda , daha o döngüden çıkmadan programı atabildim. O döngü olmasa , seri porttan atmak zorunda kalacaktım.

Erhan YILMAZ

Osilatör kitleme döngüsü hayat kurtarmış :) Hocam bende yanlış konfigürasyondan 2 tane lpc1114 ziyan ettim şimdi onların yerine lpc1343 taktım bişey olmasın diye ondan soruyorum. Bende kullanmaktan yana değilim ama tek ssp modülü var oda swd pinleriyle ilişkili. Çipi inceliyorum haydarpasamikronun dediği gibi bazı pinler için remap olayı var ama yeterli değil. Pek bilmediğimden soruyorum bu pinleri kullanmak zorunda kalırsak nelere dikkat etmek gerek. İhtiyacım olmasa yüzüne bile bakmam yoksa. :)

Veli B.

Prototip çalışması yapıyorsan, kod oturuncaya kadar xtal pin headerla bağlantılı olsun. Kilitlendiğinde Xtali söküp SWD ile programlayıp sorunu düzeltebilirsin.

Erhan YILMAZ

Alıntı yapılan: katana - 31 Ocak 2012, 03:30:27
Prototip çalışması yapıyorsan, kod oturuncaya kadar xtal pin headerla bağlantılı olsun. Kilitlendiğinde Xtali söküp SWD ile programlayıp sorunu düzeltebilirsin.

Dediğinizi not ettim hocam sağolun benim şimdilik öyle bi sorunum yok.

Erhan YILMAZ

Aklıma gelen başıma geldi! Demin uğraşırken SSP0 clock pinini swd clock pininin olduğu pinden aldım programı atar atmaz daha SWD üzerinden program atamaz oldum.Şükür USB bootloader ile tekrar program atıp düzelttim. Buda bana ders olsun. :)

haydarpasamikro

Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Erhan YILMAZ

Alıntı yapılan: haydarpasamikro - 01 Şubat 2012, 18:25:00
SCK pinini remap yapın bence.

Yaptım. PIO2_11 pininden alıyorum şuanda SCK pinini. Aslında nxpnin kendi örneğinde de o şekilde yapmış ama ben dikkat etmeyince olan  oldu. :D

f15eagle

Alıntı yapılan: Erhan YILMAZ - 01 Şubat 2012, 18:10:02
Aklıma gelen başıma geldi! Demin uğraşırken SSP0 clock pinini swd clock pininin olduğu pinden aldım programı atar atmaz daha SWD üzerinden program atamaz oldum.Şükür USB bootloader ile tekrar program atıp düzelttim. Buda bana ders olsun. :)

USB bootlader hakkında biraz bilgi verebilirmisiniz? Bende stm32f4 kitime LCD programı attım pinlere dikkat etmeden şimdi SWD ile program atamıyorum. Seri porttan resetleyip  düzeltmek istiyorum neler yapmam gerek

Erhan YILMAZ

Alıntı yapılan: f15eagle - 01 Şubat 2012, 20:29:34
USB bootlader hakkında biraz bilgi verebilirmisiniz? Bende stm32f4 kitime LCD programı attım pinlere dikkat etmeden şimdi SWD ile program atamıyorum. Seri porttan resetleyip  düzeltmek istiyorum neler yapmam gerek

stm32f4 ile ilgili pek bilgim yok ama LPC1343 USB bootloader için bi yazı hazırlamıştım aşağıdaki bağlantılardan inceleyebilirsin.

http://www.mcu-turkey.com/?p=20564
https://320volt.com/lpcxpresso-kit-lpc1343-usb-boot-loader-denemesi/

Erhan YILMAZ

Yazdığım örnek spi kodunu ekliyorum birilerinin işine yarar. Detaylı test debug v.s etmedim

ama bu kodlarla 3310 lcdsi sürdüm sorun  çıkmadı. Alma fonksiyonunu denemedim ama datasheet

ve örneklerdekine uygun olarak yazdım bi problem çıkacağını sanmıyorum.

MOSI0 -> PIO0_9
MISO0 -> PIO0_8
SCK0   -> PIO2_11

/***************************************************************
*  Name    :  spi_deneme			                         *
*  Author  :  Erhan YILMAZ  			                       *
*  Notice  :                                                   *
*          : All Rights Reserved                               *
*  Date    : 01-02-2012	                                       *
*  Version : 1.0                                               *
*  Notes   : 							                       *
'**************************************************************/

#include <LPC13xx.h>                      


 //Saat kaynagi olarak PLL(FCLK=72MHz) kullanılır. PLL kaynağı olarak 12MHz harici kristal kullanılır.

 void osc_init(void){
 	uint32_t i;
 	LPC_SYSCON->PDRUNCFG &=~(1<<5); 		// sistem osilatörünü aç
	LPC_SYSCON->SYSOSCCTRL = 0x00; 			// krsital baglama araligi 1-20MHz + Osilatör pllye gönderilmez.
	for(i=0;i<200;i++);
	LPC_SYSCON->SYSPLLCLKSEL = 0x01;	  	// Select external crystal as PLL clock source
   	LPC_SYSCON->SYSPLLCLKUEN = 0x00;	  	// Toggle update register once
	LPC_SYSCON->SYSPLLCLKUEN = 0x01;	  	// Update clock source again
	// Wait until the clock is updated
  	while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));
	// Fclkout = M * Fclkin = FCCO / (2 * P)
    // FCCO should be in the range of 156-320MHz 
	LPC_SYSCON->SYSPLLCTRL = 0x25;		  	//M=6 P=2 Fclkout=72MHz FCCO=288Mhz
	LPC_SYSCON->PDRUNCFG &=~(1<<7);   		// Enable system PLL
	while(!(LPC_SYSCON->SYSPLLSTAT & 0x01)); //pll kitlenene kadar bekle
	LPC_SYSCON->MAINCLKSEL = 3; 			// main clock = PLLClockout	
	LPC_SYSCON->MAINCLKUEN = 0;				// main clock seçme
	LPC_SYSCON->MAINCLKUEN = 1;				// güncellemesi
	// Wait until the clock is updated
  	while (!(LPC_SYSCON->MAINCLKUEN & 0x01));
	LPC_SYSCON->SYSAHBCLKDIV = 0x01;		//System AHB clk divider=1;
	LPC_SYSCON->SYSAHBCLKCTRL	|= (1<<16);	// Enabled IOCON clock for I/O related peripherals
	
 	}

void SystemInit(){
 	osc_init();
 	LPC_GPIO0 -> DIR |= 1<<7;	   			//GPIO0_7 pini çikis olarak ayarlandi.
	LPC_GPIO1 -> DIR |= (1<<5 | 1<<8);	   //GPIO1_5 ve GPIO1_8 pinleri çikis olarak ayarlandi.

 	}
// Set SSP0 SPI Master 8 bit frame format
// SPI Clock = PCLK/(CPSDVSRx(SCR+1))
void SSP0_Init(){
	uint8_t i,Dummy;
	LPC_SYSCON->SYSAHBCLKCTRL	|= (1<<11);	// SSP Clock enable	
	// Reset SSP 
	LPC_SYSCON->PRESETCTRL &=	  ~(1<<0);
  	LPC_SYSCON->PRESETCTRL |=	   (1<<0);
	LPC_SYSCON->SSP0CLKDIV = 0x1;	//SSP0 Clock divide by 1 so PCL=FCLK
 
	//SCK pin on PIO2_11
	LPC_IOCON->SCK_LOC = 0x01;			
	//Pin functions is MISO0
	LPC_IOCON->PIO0_8 &= ~0x07;
	LPC_IOCON->PIO0_8 |= 0x1;			
	//Pin functions is MOSI0
	LPC_IOCON->PIO0_9 &= ~0x07;
	LPC_IOCON->PIO0_9 |= 0x1;			
	//Pin functions is SCK0
	LPC_IOCON->PIO2_11 &= ~0x07;	
  	LPC_IOCON->PIO2_11 = 0x01;	

	//Set CR0 SPI 8bit format SCR=8 CPOL=Low between frames CPHA=First clock transition
	LPC_SSP0->CR0 = 0x00000807;			
	LPC_SSP0->CPSR = 32;	//CPSR=32

	// Clear the Rx FIFO
    for ( i = 0; i < 8; i++ )
    {
      Dummy = LPC_SSP0->DR;
    }

	LPC_SSP0->CR1 = (1<<1);	//Eneble SSP0 in SPI master mod

}

void SPI0_Send(uint32_t spi_data){
	
	// Move on only if NOT busy and TX FIFO not full. 
	while((LPC_SSP0->SR & 0x12) != 0x02);
	LPC_SSP0->DR = spi_data;
	// Wait until the Busy bit is cleared.
	//while ( LPC_SSP0->SR & (1<<4) );
}

uint32_t SPI0_Recevice(){
	LPC_SSP0->DR = 0xFF;
	// Wait until the Busy bit is cleared
	while ( (LPC_SSP0->SR & (0x14)) != 0x04 );
	return LPC_SSP0->DR;		
}

int main (void) {
	SSP0_Init();		//SPI Clock=250kHz
  while (1)  { 
  SPI0_Send(0xAA);

  }
}