標(biāo)題:
STM32 SPI總線介紹
[打印本頁(yè)]
作者:
sane
時(shí)間:
2019-11-24 20:30
標(biāo)題:
STM32 SPI總線介紹
SPI總線 速度比IIC快
SCK信號(hào)時(shí)鐘線
MOSI為主輸出從輸入
MISO為主輸入從輸出
SS片選信號(hào)線(也稱NSS、CS),每個(gè)信號(hào)單獨(dú)使用一根
SPI協(xié)議中沒(méi)有設(shè)備地址,SS信號(hào)為低時(shí)選中設(shè)別,SS信號(hào)為高時(shí)作為結(jié)束信號(hào)。
數(shù)據(jù)傳輸分為高位先行和低位先行
CPOL及CPHA的不同狀態(tài),SPI分為四種模式,主機(jī)與從機(jī)需要工作在相同的模式下才可以正常通訊,實(shí)際中采用較多的是“模式0”與“模式3”.
SPI模式 CPOL CPHA 空閑時(shí)SCK時(shí)鐘 采樣時(shí)刻
0 0 0 低電平 奇數(shù)邊沿
1 0 1 低電平 偶數(shù)邊沿
2 1 0 高電平 奇數(shù)邊沿
3 1 1 高電平 偶數(shù)邊沿
STM32 的SPI外設(shè)可用作通訊的主機(jī)及從機(jī),支持最高的SCK時(shí)鐘頻率為Fpclk/2(STM32F10X型號(hào)的默認(rèn)Fpclk1為72M,F(xiàn)pclk2為36M),完全支持SPI的四種模式,數(shù)據(jù)幀長(zhǎng)度可設(shè)置為8為或16位,可設(shè)置數(shù)據(jù)MSB先行或者LSB先行,支持全雙工、雙線單行及單線模式。
STM32 SPI初始化結(jié)構(gòu)體
typedef struct
{
uint16_t SPI_Direction; /*設(shè)置SPI的單雙向模式 */
{SPI_Direction_2Lines_FullDuplex //雙線全雙工
SPI_Direction_2Lines_RxOnly //雙線只接收
SPI_Direction_1Line_Rx //單線只接收
SPI_Direction_1Line_Tx //單線只發(fā)送
}
uint16_t SPI_Mode; /*設(shè)置SPI的主/從機(jī)端模式 */
uint16_t SPI_DataSize; /*設(shè)置SPI的數(shù)據(jù)幀長(zhǎng)度,可選8/16位 */
uint16_t SPI_CPOL; /*設(shè)置時(shí)鐘極性CPOL,可選高/低電平 */
uint16_t SPI_CPHA; /*設(shè)置時(shí)鐘相位,可選奇/偶邊沿采樣 */
uint16_t SPI_NSS; /*設(shè)置NSS引腳由SPI硬件控制還是軟件控制*/
uint16_t SPI_BaudRatePrescaler; /*設(shè)置時(shí)鐘分頻因子,fpclk/分頻數(shù) = fsck */
uint16_t SPI_FirstBit; /*設(shè)置MSB/LSB先行 */
uint16_t SPI_CRCPolynomial; /*設(shè)置CRC校驗(yàn)的表達(dá)式 */
}SPI_InitTypeDef;
void SPI_FLASH_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
//SPI SCK
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = SPI_SCK_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_SCK_GPIO_Port, &GPIO_InitStruct);
//SPI MOSI
GPIO_InitStruct.GPIO_Pin = SPI_MOSI_GPIO_PIN;
GPIO_Init(SPI_MOSI_GPIO_Port, &GPIO_InitStruct);
//SPI MISO
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = SPI_MISO_GPIO_PIN;
GPIO_Init(SPI_MISO_GPIO_Port, &GPIO_InitStruct);
//SPI SS
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = SPI_SS_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_SS_GPIO_Port, &GPIO_InitStruct);
GPIO_SetBits( GPIOB, SPI_SS_GPIO_PIN);
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CRCPolynomial = SPI_SPEED;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_Init(SPI_FLASH, &SPI_InitStruct);
SPI_Cmd(SPI_FLASH, ENABLE);
}
//flash 必須先擦除才能再寫入
nor flash 除擦除必須以一個(gè)扇區(qū)完成外,其余均可以字節(jié)為單位操作
nand flash 擦除 讀寫均必須以扇區(qū)為最小的單位進(jìn)行操作
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1