STM32 SPI接口的簡(jiǎn)單實(shí)現
通常SPI通過(guò)4個(gè)引腳與外部器件相連:
● MISO:主設備輸入/從設備輸出引腳。該引腳在從模式下發(fā)送數據,在主模式下接收數據。
● MOSI:主設備輸出/從設備輸入引腳。該引腳在主模式下發(fā)送數據,在從模式下接收數據。
● SCK:串口時(shí)鐘,作為主設備的輸出,從設備的輸入
●NSS:從設備選擇。這是一個(gè)可選的引腳,用來(lái)選擇主/從設備。它的功能是用來(lái)作為“片選引腳”,讓主設備可以單獨地與特定從設備通訊,避免數據線(xiàn)上的沖突。從設備的NSS引腳可以由主設備的一個(gè)標準I/O引腳來(lái)驅動(dòng)。一旦被使能(SSOE位),NSS引腳也可以作為輸出引腳,并在SPI處于主模式時(shí)拉低;此時(shí),所有的SPI設備,如果它們的NSS引腳連接到主設備的NSS引腳,則會(huì )檢測到低電平,如果它們被設置為NSS硬件模式,就會(huì )自動(dòng)進(jìn)入從設備狀態(tài)。當配置為主設備、NSS配置為輸入引腳(MSTR=1,SSOE=0)時(shí),如果NSS被拉低,則這個(gè)SPI設備進(jìn)入主模式失敗狀態(tài):即MSTR位被自動(dòng)清除,此設備進(jìn)入從模式。
時(shí)鐘信號的相位和極性
SPI_CR寄存器的CPOL和CPHA位,能夠組合成四種可能的時(shí)序關(guān)系。CPOL(時(shí)鐘極性)位控制在沒(méi)有數據傳輸時(shí)時(shí)鐘的空閑狀態(tài)電平,此位對主模式和從模式下的設備都有效。如果CPOL被清’0’,SCK引腳在空閑狀態(tài)保持低電平;如果CPOL被置’1’,SCK引腳在空閑狀態(tài)保持高電平。
如果CPHA(時(shí)鐘相位)位被置’1’,SCK時(shí)鐘的第二個(gè)邊沿(CPOL位為0時(shí)就是下降沿,CPOL位為’1’時(shí)就是上升沿)進(jìn)行數據位的采樣,數據在第二個(gè)時(shí)鐘邊沿被鎖存。如果CPHA位被清’0’,SCK時(shí)鐘的第一邊沿(CPOL位為’0’時(shí)就是下降沿,CPOL位為’1’時(shí)就是上升沿)進(jìn)行數據位采樣,數據在第一個(gè)時(shí)鐘邊沿被鎖存。
CPOL時(shí)鐘極性和CPHA時(shí)鐘相位的組合選擇數據捕捉的時(shí)鐘邊沿。
圖212顯示了SPI傳輸的4種CPHA和CPOL位組合。此圖可以解釋為主設備和從設備的SCK腳、MISO腳、MOSI腳直接連接的主或從時(shí)序圖。
CPOL時(shí)鐘極性和CPHA時(shí)鐘相位的組合選擇數據捕捉的時(shí)鐘邊沿。
上圖顯示了SPI傳輸的4種CPHA和CPOL位組合。此圖可以解釋為主設備和從設備的SCK腳、MISO腳、MOSI腳直接連接的主或從時(shí)序圖。
注意:
1. 在改變CPOL/CPHA位之前,必須清除SPE位將SPI禁止。
2. 主和從必須配置成相同的時(shí)序模式。
3.SCK的空閑狀態(tài)必須和SPI_CR1寄存器指定的極性一致(CPOL為’1’時(shí),空閑時(shí)應上拉SCK為高電平;CPOL為’0’時(shí),空閑時(shí)應下拉SCK為低電平)。
4. 數據幀格式(8位或16位)由SPI_CR1寄存器的DFF位選擇,并且決定發(fā)送/接收的數據長(cháng)度。
我只要知道主機和從機的CPOL和CPHA位要一致就夠了。
有2種NSS模式:
●軟件NSS模式:可以通過(guò)設置SPI_CR1寄存器的SSM位來(lái)使能這種模式。在這種模式下NSS引腳可以用作它用,而內部NSS信號電平可以通過(guò)寫(xiě)SPI_CR1的SSI位來(lái)驅動(dòng)
● 硬件NSS模式,分兩種情況:
─NSS輸出被使能:當STM32F10xxx工作為主SPI,并且NSS輸出已經(jīng)通過(guò)SPI_CR2寄存器的SSOE位使能,這時(shí)NSS引腳被拉低,所有NSS引腳與這個(gè)主SPI的NSS引腳相連并配置為硬件NSS的SPI設備,將自動(dòng)變成從SPI設備。當一個(gè)SPI設備需要發(fā)送廣播數據,它必須拉低NSS信號,以通知所有其它的設備它是主設備;如果它不能拉低NSS,這意味著(zhù)總線(xiàn)上有另外一個(gè)主設備在通信,這時(shí)將產(chǎn)生一個(gè)硬件失敗錯誤(HardFault)。
─ NSS輸出被關(guān)閉:允許操作于多主環(huán)境。
//我們用軟件NSS主從的轉換都可借助庫來(lái)實(shí)現
數據幀格式
根據SPI_CR1寄存器中的LSBFIRST位,輸出數據位時(shí)可以MSB在先也可以L(fǎng)SB在先。
根據SPI_CR1寄存器的DFF位,每個(gè)數據幀可以是8位或是16位。所選擇的數據幀格式對發(fā)送和/或接收都有效。
配置一個(gè)SPI 這里選SPI2
如下:
SPI_InitTypeDef SPI_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
SPI_Cmd(SPI2, DISABLE); //必須先禁能,才能改變MODE
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //兩線(xiàn)全雙工
SPI_InitStructure.SPI_Mode =SPI_Mode_Master; //主
SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b; //8位
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High; //CPOL=1時(shí)鐘懸空高
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge; //CPHA=1 數據捕獲第2個(gè)
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft; //軟件NSS
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_2; //2分頻
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial =7; //CRC7
SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
//spi的配置結束了可以使用了。
也可用 函數SPI_StructInit 把SPI_InitStruct中的每一個(gè)參數按缺省值填入
_____________________________________________________________________________________
發(fā)送緩沖器空閑標志(TXE)【3.0 SPI_I2S_FLAG_TXE】
此標志為’1’時(shí)表明發(fā)送緩沖器為空,可以寫(xiě)下一個(gè)待發(fā)送的數據進(jìn)入緩沖器中。當寫(xiě)入SPI_DR時(shí),TXE標志被清除。
接收緩沖器非空(RXNE)【3.0 SPI_I2S_FLAG_RXNE】
此標志為’1’時(shí)表明在接收緩沖器中包含有效的接收數據。讀SPI數據寄存器可以清除此標志。
注意在2.0的庫中函數
SPI_SendData SPI_ReceiveData SPI_GetFlagStatus 等在3.0的庫中 變?yōu)?br>
SPI_I2S_SendData SPI_I2S_ReceiveData SPI_I2S_GetFlagStatus
寫(xiě)一個(gè)發(fā)送/接受函數
static u8 SPIByte(u8 byte)
{
while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
//while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);
SPI2->DR = byte;
//SPI_I2S_SendData(SPI2,byte);
while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
//while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))==RESET);
return(SPI2->DR);
//returnSPI_I2S_ReceiveData(SPI2);讀寄存器用硬件清除標志位。
//SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE) ;直接軟件清除標志位。
}
這里有兩種寫(xiě)法直接操作寄存器與用庫函數,相對來(lái)說(shuō)直接操作寄存器應該更直觀(guān)一些。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
調試總會(huì )遇到這樣那樣的小問(wèn)題 和朋友一起進(jìn)步總會(huì )更快 希望對別人能有點(diǎn)幫助節省些時(shí)間
萬(wàn)利的板子 板載的M25P80 PDF寫(xiě)的這一型號有 25MHZ 和50MHZ兩種 注意初始化SPI的設置 BAUD至少就要PCLK/2 = 36Mhz
即使配置為主模式發(fā)送 時(shí)鐘也不是連產(chǎn)生的 接收的時(shí)候同樣需要發(fā)送無(wú)用字節以維持數據時(shí)鐘
STM32 的 NSS腳需要配置為軟件模式(可以通過(guò)寄存器控制NSS高低) 硬件模式下 NSS引腳必須+ 正的邏輯電平 才能將SPE MSTR位時(shí)能配置SPI為主模式
先寫(xiě)了一遍 然后借鑒一個(gè)sst25vf08的應用筆記又寫(xiě)了一遍 看這個(gè)筆記省了不少時(shí)間 很感謝
同一地址單元 重新寫(xiě)入需先擦除 否者二次寫(xiě)入后讀出無(wú)效
其他按照時(shí)序走就可以了
程序如下:
#define WREN 0x06
#define WRDI 0x04
#define RDSR 0x05
#define WRSR 0x01
#define READ 0x03
#define FAST_READ 0x06
#define PAGE_PROG 0x02
#define SECTOR_ERASER 0xd8
#define BULK_ERASER 0xc7
#define DEEP_SLEEP 0xb9
#define RES 0xab
#define M25P80_SELECT() GPIOB->BRR |= GPIO_Pin_2
#define M25P80_DESELECT() GPIOB->BSRR |= GPIO_Pin_2
u8 SPI_SeRe_Byte(u8 data);
void M25p80_Cmd1b(u8 cmd);
u8 M25p80_Cmd1b_R1b(u8 cmd);
void M25p80_Cmd1b_S1b(u8 cmd , u8 data);
void M25p80_WP_En(void);
void M25p80_Write_En(void);
u8 M25p80_Busy(void);
u8 M25p80_Read_1Byte(u32 addr );
void M25p80_Read_Bytes(u32 addr , u8* re_buf_p , u16 no);
void M25p80_Write_1Byte(u32 addr , u8 data);
void M25p80_Write_Bytes(u32 addr , u8* wr_buf_p , u16 no);
void M25p80_Section_Erase(u32 addr);
void M25p80_Bulk_Erase(void);
/********************************************************************************************************************
* op-code for M25P80 SPI EEROM
* 8Mbit = 1,048,576 bytes = 16 sectors (512 Kbits, 65536 bytes each) = 4096 pages (256 bytes each)
* 1sector = 256 page
* address range 00000 ~ fffffh
*********************************************************************************************************************/
u8 SPI_SeRe_Byte(u8 data)
{
u8 re_data;
while(! (SPI1->SR & 0x0002) );/*TXE?*/
SPI1->DR = data;
while(! (SPI1->SR & 0x0001) );/*RXNE?*/
re_data = SPI1->DR;
return re_data;
}
/************************************************************************************************************
*函數名稱(chēng):M25p80_cmd1b_r1b/M25p80_Cmd1b_S1b CMD命令發(fā)送 返回1BYTE/命令發(fā)送跟送1BYTE
************************************************************************************************************/
void M25p80_Cmd1b(u8 cmd)
{
M25P80_SELECT();
SPI_SeRe_Byte(cmd);
M25P80_DESELECT();
}
u8 M25p80_Cmd1b_R1b(u8 cmd)
{
u8 data;
M25P80_SELECT();
SPI_SeRe_Byte(cmd);
data = SPI_SeRe_Byte(0xff);
M25P80_DESELECT();
return data;
}
void M25p80_Cmd1b_S1b(u8 cmd , u8 data)
{
M25P80_SELECT();
SPI_SeRe_Byte(cmd);
SPI_SeRe_Byte(data);
M25P80_DESELECT();
}
/****************************************************************************************************************/
/************************************************************************************************************
*函數名稱(chēng):M25p80_WP_En/M25p80_Write_En M25p80寫(xiě)保護使能/寫(xiě)使能 status寄存器修改
************************************************************************************************************/
void M25p80_WP_En(void)
{
u8 sta;
sta = M25p80_Cmd1b_R1b(RDSR) | 0x1c;
M25p80_Cmd1b_S1b(WRSR, sta);
M25p80_Cmd1b(WRDI);
}
void M25p80_Write_En(void)
{
u8 sta;
sta = M25p80_Cmd1b_R1b(RDSR) & (~0x1c);
M25p80_Cmd1b_S1b(WRSR, sta);
M25p80_Cmd1b(WREN);
}
/****************************************************************************************************************/
u8 M25p80_Busy(void)
{
u8 sta;
sta = M25p80_Cmd1b_R1b(RDSR);
return (sta & 0x01);
}
u8 M25p80_Read_1Byte(u32 addr )
{
u8 ad[3] , data;
ad[0] = (addr & 0x00ff0000) >> 16;
ad[1] = (addr & 0x0000ff00) >> 8;
ad[2] = (addr & 0x000000ff);
M25P80_SELECT();
SPI_SeRe_Byte(READ);
SPI_SeRe_Byte(ad[0]);
SPI_SeRe_Byte(ad[1]);
SPI_SeRe_Byte(ad[2]);
data = SPI_SeRe_Byte(0xff);
M25P80_DESELECT();
return data;
}
void M25p80_Read_Bytes(u32 addr , u8* re_buf_p , u16 no)
{
u8 ad[3] ;
ad[0] = (addr & 0x00ff0000) >> 16;
ad[1] = (addr & 0x0000ff00) >> 8;
ad[2] = (addr & 0x000000ff);
M25P80_SELECT();
SPI_SeRe_Byte(READ);
SPI_SeRe_Byte(ad[0]);
SPI_SeRe_Byte(ad[1]);
SPI_SeRe_Byte(ad[2]);
for(; no > 0; no--)
*re_buf_p++ = SPI_SeRe_Byte(0xff);
M25P80_DESELECT();
}
/****************************************************************************************************************/
void M25p80_Write_1Byte(u32 addr , u8 data)
{
u8 ad[3] ;
ad[0] = (addr & 0x00ff0000) >> 16;
ad[1] = (addr & 0x0000ff00) >> 8;
ad[2] = (addr & 0x000000ff);
M25p80_Write_En();
M25P80_SELECT();
SPI_SeRe_Byte(PAGE_PROG);
SPI_SeRe_Byte(ad[0]);
SPI_SeRe_Byte(ad[1]);
SPI_SeRe_Byte(ad[2]);
SPI_SeRe_Byte(data);
M25P80_DESELECT();
M25p80_WP_En();
while(M25p80_Busy());
}
void M25p80_Write_Bytes(u32 addr , u8* wr_buf_p , u16 no)
{
/*
u8 ad[3] ;
ad[0] = (addr & 0x00ff0000) >> 16;
ad[1] = (addr & 0x0000ff00) >> 8;
ad[2] = (addr & 0x000000ff);
if( no < 255 -ad[2] ) return 0 ;//PP寫(xiě)操作過(guò)本頁(yè)地址從本頁(yè)首地址循環(huán)寫(xiě)
M25p80_Cmd1b(WREN);
M25P80_SELECT();
SPI_SeRe_Byte(PAGE_PROG);
SPI_SeRe_Byte(ad[0]);
SPI_SeRe_Byte(ad[1]);
SPI_SeRe_Byte(ad[2]);
for(; no > 0; no--)
*wr_buf_p++ = SPI_SeRe_Byte(0xff);
M25P80_DESELECT();
M25p80_Cmd1b(WRDI);
return 1;
*/
for(; no > 0; no--)
{
M25p80_Write_1Byte(addr , *wr_buf_p);
addr++;wr_buf_p++;
}
M25p80_WP_En();
}
/****************************************************************************************************************/
void M25p80_Section_Erase(u32 addr)
{
u8 ad[3] ;
ad[0] = (addr & 0x00ff0000) >> 16;
ad[1] = (addr & 0x0000ff00) >> 8;
ad[2] = (addr & 0x000000ff);
M25p80_Write_En();
M25P80_SELECT();
SPI_SeRe_Byte(SECTOR_ERASER);
SPI_SeRe_Byte(ad[0]);
SPI_SeRe_Byte(ad[1]);
SPI_SeRe_Byte(ad[2]);
M25P80_DESELECT();
while(M25p80_Busy());
M25p80_WP_En();
}
void M25p80_Bulk_Erase(void)
{
M25p80_Write_En();
M25p80_Cmd1b(BULK_ERASER);
while(M25p80_Busy());
M25p80_WP_En();
}
這里的多字節寫(xiě)函數void M25p80_Write_Bytes(u32 addr , u8* wr_buf_p , u16 no) 調用了單字節寫(xiě)函數 實(shí)際上還是一個(gè)一個(gè)寫(xiě) 主要因為用頁(yè)寫(xiě)操作的話(huà) 當數據到達頁(yè)底會(huì )返回本頁(yè)從頭開(kāi)始寫(xiě) 會(huì )破壞數據 而且沒(méi)有字節寫(xiě)操作碼感覺(jué)比sst25vf08麻煩很多。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
關(guān)于STM32 SPI NSS問(wèn)題的探討。
對于STM32的SPI ,Reference Manual中是給出的schematic如下:
按照標準的SPI協(xié)議,當SPI被配置為主機模式后,通過(guò)SPI對從設備進(jìn)行操作時(shí),其N(xiāo)SS應該自動(dòng)置低,從而選中(使能)從設備;一旦不對從設備進(jìn)行操作,NSS立刻置為高。
但是,我在實(shí)際調試過(guò)程中卻發(fā)現:STM32 SPI NSS無(wú)法自動(dòng)實(shí)現跳變。 一旦SPI初始化完成并使能SPI,NSS立刻置低,然后保持不變。
這個(gè)問(wèn)題一直無(wú)法解決,直到我在ST官方論壇上看到國外有些技術(shù)人員也在討論這個(gè)問(wèn)題,他們得出的結論是:STM32 SPI NSS無(wú)法自動(dòng)跳變。
RichardE Posted 24-07-2009 at 16:07
Registered on :
11-05-2005
From UK (United Kingdom)
Messages : 19
OFF-Line
I've just hit this NSS problem.
What is good:
That the discussion is here on the forum to stop me spending hours trying to work out what I have done wrong. Thanks guys!
What is not good:
That NSS doesn't behave as expected.
What I expected to happen:
I'm expecting to see on my scope what I see in Figure 208 of RM008 Reference Manual, i.e. NSS goes high after the transfer.
Why a working NSS would be very helpful:
I'm using the SPI (with DMA) to clock data into shift registers. If NSS went high after the transfer (as indicated by Figure 208), I could use that edge as the strobe to latch the data across into the shift register outputs. Everything would be done by the peripheral. Fire and forget. As it is with the broken NSS, I have to generate an interrupt and use that to strobe the gpio output (I hate controlling gpio from within interrupt routines).
Any update as to when this will be fixed?
ST官方技術(shù)人員也證實(shí):STM32 SPI NSS是不會(huì )自動(dòng)置位和復位的。按照官方說(shuō)法,ST已經(jīng)將其列入了改進(jìn)計劃。
對于這個(gè)問(wèn)題,可以采用下面的方法解決:
在SPI初始化時(shí),采用NSS soft模式,然后使能NSS輸出功能。從而將NSS當做GPIO使用,通過(guò)軟件set和reset來(lái)實(shí)現NSS的置位和復位。
具體代碼如下:
/* SPI1 configuration ------------------------------------------------------*/
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/*Enable SPI1.NSS as a GPIO*/
SPI_SSOutputCmd(SPI1, ENABLE);
/*Configure PA.4(NSS)--------------------------------------------*/
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
通過(guò)將NSS配置為GPIO,在通過(guò)SPI操作從設備時(shí),就可以通過(guò)軟件來(lái)選中和釋放從設備了。雖然比起硬件自動(dòng)置位要麻煩,但問(wèn)題畢竟解決了。
進(jìn)一步閱讀長(cháng)達900頁(yè)的Manual,我發(fā)現,文中對于SPI hard模式的描述并非大多數人所認為的硬件SPI,原文如下:
Slave select (NSS) pin management
There are two NSS modes:
● Software NSS mode: this mode is enabled by setting the SSM bit in the SPI_CR1
register (see Figure 209). In this mode, the external NSS pin is free for other
application uses and the internal NSS signal level is driven by writing to the SSI bit in
the SPI_CR1 register.
● Hardware NSS mode: there are two cases:
– NSS output is enabled: when the STM32F20xxx is operating as a Master and the
NSS output is enabled through the SSOE bit in the SPI_CR2 register, the NSS pin
is driven low and all the NSS pins of devices connected to the Master NSS pin see
a low level and become slaves when they are configured in NSS hardware mode.
When an SPI wants to broadcast a message, it has to pull NSS low to inform all
others that there is now a master for the bus. If it fails to pull NSS low, this means
that there is another master communicating, and a Hard Fault error occurs.
– NSS output is disabled: the multimaster capability is allowed.
當SPI配置為hard模式后,通過(guò)檢測NSS可以實(shí)現的是自身主機和從機模式的切換,而不是大多數人所認為的自動(dòng)NSS。。。也就是說(shuō):在一個(gè)多SPI系統中,STM32 SPI通過(guò)NSS檢測,一旦發(fā)現系統中無(wú)NSS低信號,自己就輸出低,從而成為主機;當系統中有NSS低信號時(shí)(及已經(jīng)有其它SPI宣布為主機),自己就配置為從機。 所謂的hard模式的NSS,實(shí)際就是為了實(shí)現多機間通信的。
小結:
望文生義很可怕,Manual要仔細研讀。
STM32的SPI NSS不論是配置為soft還是hard都是無(wú)法自動(dòng)置位的,但這卻是大多數應用所需要的。正如ST 論壇上RichardE所說(shuō):“Everything would be done by the peripheral. Fire and forget.”
呵呵,有趣的說(shuō)法:Fire and forget! ~~~~
本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/chseangs/archive/2009/09/04/4520733.aspx
聯(lián)系客服