spi速率計算公式為:PCLK / (CPSDVSR *[SCR+1])
公式出處:lpc1114用戶手冊SSP章節(jié)CR0寄存器的bit15:bit8定義的解釋里面
PCLK是當前SSP的時鐘,CPSDVSR是寄存器CPSR值,SCR是CR0寄存器bit15:bit8的值。
所以spi的速率受到了3個寄存器值的影響,這3個寄存器分別是:
1. LPC_SYSCON->SSP1CLKDIV或者 LPC_SYSCON->SSP0CLKDIV(這是SSP的分頻寄存器)
2. LPC_SSP1->CR0(這是SSP控制寄存器0,其中bit15:bit8決定速率)
3. LPC_SSP1->CPSR(這是SSP時鐘預分頻寄存器)
得到這3個寄存器的值,就可以計算出當前的spi速率值,例如下面的SPI1初始化函數(shù):
voidSPI1_Init(void){uint8_ti,Clear=Clear;//Clear=Clear:用這種語句形式解決編譯產生的Waring:neverused!LPC_SYSCON->PRESETCTRL|=(0x1<<2);//禁止LPC_SSP1復位LPC_SYSCON->SYSAHBCLKCTRL|=(0x1<<18);//允許LPC_SSP1時鐘bit18LPC_SYSCON->SSP1CLKDIV=10;//10分頻:50/10=5MhzLPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);//使能IOCON時鐘(bit16)LPC_IOCON->PIO2_1&=~0x07;LPC_IOCON->PIO2_1|=0x02;//把PIO2_1選擇為LPC_SSPCLKLPC_IOCON->PIO2_2&=~0x07;LPC_IOCON->PIO2_2|=0x02;//把PIO2_2選擇為LPC_SSPMISOLPC_IOCON->PIO2_3&=~0x07;LPC_IOCON->PIO2_3|=0x02;//把PIO2_3選擇為LPC_SSPMOSILPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);//禁能IOCON時鐘(bit16)//8位數(shù)據(jù)傳輸,SPI模式,CPOL=1,CPHA=1,空閑時CLK為1,SCR=4LPC_SSP1->CR0=0x04C7;//預分頻值(注意:這里必須為偶數(shù)2~254)LPC_SSP1->CPSR=10;LPC_SSP1->CR1&=~(1<<0);//LBM=0:正常模式LPC_SSP1->CR1&=~(1<<2);//MS=0:主機模式LPC_SSP1->CR1|=(1<<1);//SSE=1:使能SPI1//清空RxFIFO,LPC1114收發(fā)均有8幀F(xiàn)IFO,每幀可放置4~16位數(shù)據(jù)for(i=0;i<8;i++){Clear=LPC_SSP1->DR;//讀數(shù)據(jù)寄存器DR將清空RxFIFO}}
上面例子中,主頻50MHz,LPC_SYSCON->SSP1CLKDIV值為10,即PCLK=5MHz;LPC_SSP1->CR0=0x04c7,即bit15:bit8為4,即SCR=4;LPC_SSP1->CPSR=10;帶入公式計算得出,現(xiàn)在的SPI速率應該是100KHz.
上圖中,示波器,橫向每格表示5微秒,圖中一個周期就是10微秒,即100KHz,實測與理論完全一致。