도와주세요!!
글 수 15,339
2004.08.10 10:54:32 (*.219.11.25)
27156
안녕하십니까.
현재 Ez-Board를 대체하기 위해서 Ez-X5 와 Ez-EX01을 사용하고 있습니다.
Ez-Board에서 사용하던 SSP통신 부분을 초기화부분등만 수정하였습니다.
루프백모드로 할 경우에는 데이터가 TX에 씌여짐을 확인하였습니다.
그러나 Rx,Tx모두 사용할 경우 SSSR 에서 SSSR_RNE 가 세트됨으로서 이를 읽어
주도록 하는데 무한 루프로 빠져 버립니다. 이지보드에선 잘 되던게 안되서 난
감합니다.
다음은 초기화 부분과 write하는 부분입니다.
///////////////////////////////////////////////////////
static void ssp_init()
{
CKEN |= CKEN3_SSP;
set_GPIO_mode(GPIO23_SCLK_MD ); // SSP clock
set_GPIO_mode(GPIO24_SFRM_MD ); // SSP Frame
set_GPIO_mode(GPIO25_STXD_MD ); // SSP transmit
set_GPIO_mode(GPIO26_SRXD_MD ); // SSP receive
/* turn on the SSP */
SSCR0 = 0;
SSCR0 = SSCR0_DataSize(16)| SSCR0_Motorola | SSCR0_SerClkDiv(4);
SSSR = SSSR_ROR;
printk("SSSR =%04lX
",(long unsigned int)SSSR);
SSCR1 = SSCR1_SPO | SSCR1_SPH ;
SSCR0 |= SSCR0_SSE; // enable SSP
printk(" Init SSP Comm, Succeed. Driver Ver 1.0. Clk= 114KHz.
");
printk("SSCR0 =%04lX
",(long unsigned int)SSCR0);
printk("SSCR1 =%04lX
",(long unsigned int)SSCR1);
printk("SSSR =%04lX
",(long unsigned int)SSSR);
}
static void flushRxFifo(void)
{
while (SSSR & SSSR_RNE) {
unsigned dummy;
/// printk("emptying FIFO of one entry
");
dummy = SSDR;
}
}
static void flushSSP(void)
{
/* wait for tx fifo to drain */
while (SSSR & SSSR_BSY) {
/// printk("SSP busy; waiting for idle
");
/* read whatever comes into the fifo (so we don't get
an overrun) while we wait for the SSP to go idle */
flushRxFifo();
}
/* read whatever may be (left) in the rx fifo */
flushRxFifo();
}
static void ssp_write(unsigned int wdata)
{
// unsigned char data = 0;
unsigned long flags;
spin_lock_irqsave(&lock, flags);
printk("k:(1)Write SSSR = %04lX
", SSSR);
flushSSP();
printk("k:(2)SSSR = %04lX
",SSSR);
while( !(SSSR & SSSR_TNF) )
;
SSDR = wdata;
printk("k:(3)Write SSSR = %04lX, data=%X
", SSSR,wdata);
spin_unlock_irqrestore(&lock, flags);
}
...
//////////////////////////////////////////////////////
위의 함수 flushRxFifo()에서 무한루프로 빠져 들게 됩니다.
초기 SSSR 값은 F024 입니다.
많은 조언 부탁드립니다.
그럼 수고하십시요...