因為在tinyos系統(tǒng)下,節(jié)點寫flash的速度過慢,開始懷疑是不是SPI的速度有問題,所以后來就直接在IAR上裸機讀寫FLASH,看看速度可以去到多少。用到了430的SPI的DMA模式
DMA模式之所以會更快,是因為所要傳輸?shù)臄?shù)據(jù)省去了要經(jīng)過CPU處理這一步,直接在內(nèi)部總線傳輸?shù)紻MA寄存器,然后DMA寄存器在根據(jù)情況通過總線傳輸?shù)侥繕?biāo)寄存器。這里的總線,我也還沒搞清楚。在DMA傳輸數(shù)據(jù)的時候,雖然說CPU可以繼續(xù)干自己的活,但是如果CPU要使用總線的話,而總線被DMA占用了,這時候該怎么辦?
void SpiDmaSend(uint8_t cmd,uint8_t *tx_addr, uint8_t *rx_addr,uint16_t len)
{
DMACTL0 =DMA2TSEL_3 + DMA0TSEL_4;
IFG1 &= ~( UTXIFG0 | URXIFG0 ); //Clear interrupt flag
DMA2SA = (unsigned int)&U0RXBUF; // Src address = UART RX Buffer
DMA2DA = (unsigned int) rx_addr; // Dst address = rbuf
DMA2SZ = len;
DMA2CTL = DMADT_0 + DMASBDB ;
cmd==SPI_READ ? (DMA2CTL|=DMADSTINCR_3):(DMA2CTL|=DMADSTINCR_0);
DMA0SA = (unsigned int) tx_addr;
DMA0DA = (unsigned int)&U0TXBUF;
DMA0SZ = len ;
DMA0CTL = DMASBDB;
cmd==SPI_WRITE? (DMA0CTL|=DMASRCINCR_3):(DMA0CTL|=DMASRCINCR_0,DMA0SZ+=1);
DMA2CTL|= DMAEN;
DMA0CTL|= DMAEN;
IFG1 |= UTXIFG0;
while((DMA0CTL & DMAIFG)==0);
DMA1CTL&=~ DMAEN;
DMA2CTL&=~ DMAEN;
IFG1 &=~UTXIFG0;
DMA1CTL &= ~DMAIFG;
}
使用DMA模式,首先就是選好通道,MSP430里面,有三個DMA通道。因為用到SPI雙工通信,所以發(fā)送和接收各用一個通道。然后,就是配置通道的觸發(fā)方式,各通道要傳輸?shù)淖止?jié)數(shù),還有,通道的傳輸方式,是單字節(jié)傳輸(single)還是塊傳輸(block)。同時,配置好,源地址和目的地址的地址指針是否要遞增。
關(guān)于Single和Block傳輸方式的區(qū)別,我當(dāng)時看datasheet也是看不懂,后來上網(wǎng)查,就連作者本人也說了文檔的說明看上去會讓人產(chǎn)生迷惑,呵呵。那時候我忽然覺得,原來不全是我太笨才看不懂呀偷笑。關(guān)于傳輸模式的區(qū)別,大家還是看看參考手冊,俺也說不清楚。