精學(xué)】Day14|SPI:CPOL、CPHA 與收發(fā)一字節(jié))
【嵌入式外設(shè)精學(xué)】Day14SPI 詳解CPOL、CPHA 與單字節(jié)收發(fā)今天解決接屏/Flash 總要試 mode0、mode3一次記清。目錄問(wèn)題 2. 原理 3. 代碼 4. 誤區(qū) 5. 自測(cè) 6. 答案1. 問(wèn)題為什么手冊(cè)要寫(xiě) Mode 0/3SPI 為什么比 I2C 快2. 原理2.1 四根線(xiàn)線(xiàn)作用SCK主機(jī)產(chǎn)生的時(shí)鐘MOSI主機(jī)出、從機(jī)入MISO主機(jī)入、從機(jī)出CS片選一般低有效全雙工無(wú) ACK靠 CS 選設(shè)備。2.2 兩個(gè)旋鈕名稱(chēng)含義CPOL空閑時(shí) SCK 是 0 還是 1CPHA在“第幾個(gè)邊沿”采數(shù)據(jù)2.3 四種模式記采樣沿模式空閑采樣時(shí)機(jī)0低上升沿采樣1低下降沿采樣2高下降沿采樣3高上升沿采樣從機(jī)手冊(cè)寫(xiě)哪一種主機(jī)就配哪一種配錯(cuò)會(huì)“位錯(cuò)位/讀出來(lái)像隨機(jī)”。3. 代碼示例#includestm32f4xx.huint8_tspi_xfer_byte(SPI_TypeDef*spi,uint8_tv){while(SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_TXE)RESET){}SPI_I2S_SendData(spi,v);while(SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_RXNE)RESET){}return(uint8_t)SPI_I2S_ReceiveData(spi);}uint8_tspi_read_reg(uint8_treg){uint8_tx;GPIO_ResetBits(GPIOB,GPIO_Pin_0);/* CS 拉低 */(void)spi_xfer_byte(SPI1,reg);xspi_xfer_byte(SPI1,0xFF);GPIO_SetBits(GPIOB,GPIO_Pin_0);/* CS 拉高 */returnx;}初始化時(shí)對(duì)應(yīng)設(shè) CPOL/CPHA標(biāo)準(zhǔn)庫(kù)示意SPI_InitTypeDef s;s.SPI_DirectionSPI_Direction_2Lines_FullDuplex;s.SPI_ModeSPI_Mode_Master;s.SPI_DataSizeSPI_DataSize_8b;s.SPI_CPOLSPI_CPOL_High;/* Mode 3 */s.SPI_CPHASPI_CPHA_2Edge;s.SPI_NSSSPI_NSS_Soft;s.SPI_BaudRatePrescalerSPI_BaudRatePrescaler_8;s.SPI_FirstBitSPI_FirstBit_MSB;4. 常見(jiàn)誤區(qū)誤區(qū)正解模式隨便配必須與從機(jī)一致MOSI/MISO 隨便接主出對(duì)從入主入對(duì)從出多從機(jī)都讓 MISO 輸出只能選中的設(shè)備驅(qū)動(dòng)SPI 必然比 I2C 穩(wěn)線(xiàn)更長(zhǎng)/更快時(shí)也要看驅(qū)動(dòng)與負(fù)載5. 自測(cè)Mode 0 在哪個(gè)沿采樣SPI 四根線(xiàn)分別是什么6. 答案上升沿空閑低。SCK、MOSI、MISO、CS。作者shuifanyu標(biāo)簽SPICPOLCPHA