CPHA = 1:在SCK的偶数边沿采样
1 | CPHA = 0:在SCK的奇数边沿采样2 |CPHA = 1:在SCK的偶数边沿采样
??那么这样说来,SPI的采样时刻并非由上升沿/下降沿决定的 。注意的是,在数据采样时刻,MOSI和MOSI的电平为有效电平,数据不能在这个时刻进行切换,在非采样时刻MOSI和MISO上的信号才能切换 。
??完整的时序图如下:
图4
图5
??所以说,SPI有4中工作模式:
图6
更正:工作模式3的CPOL应为1 。
注意要让主机和从机需要在相同的工作模式下,这样才可以实现正常通讯 。
下面介绍用STM32库函数实SPI通讯代码 。
#ifndef __SPI_H#define __SPI_H#include "stm32f10x.h"/* ?¨ò?è???±?á? */void SPI2_Config(void);void SPI2_SetSpeed(uint8_t Speed);uint8_t SPI2_WriteReadData(uint8_t dat);void SPI1_Config(void);void SPI1_SetSpeed(uint8_t speed);uint8_t SPI1_WriteReadData(uint8_t dat);/***************************************************************************** Function Name: SPI1_Config* Description: 3?ê??ˉSPI2* Input: None* Output: None* Return: None****************************************************************************/void SPI1_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDefSPI_InitStructure;/* SPIμ?IO?úoíSPIíaéè′ò?aê±?ó */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/* SPIμ?IO?úéè?? */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PA5.6.7é?à-/***************************************************************************//************************* éè??SPIμ?2?êy ***********************************//***************************************************************************/SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//????è???1¤SPI?£ê? SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//?÷?ú?£ê? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8??SPI SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//ê±?óDü????μ??? SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//?úμú?t??ê±?ó2é?ˉêy?Y SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//Nssê1ó?èí?t???? /* ????2¨ì??ê?¤·??μ?a256 */ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//′ó×??????aê?′?ê? SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Cmd(SPI1, ENABLE); SPI_Init(SPI1, &SPI_InitStructure);}/***************************************************************************** Function Name: SPI2_Config* Description: 3?ê??ˉSPI2* Input: None* Output: None* Return: None****************************************************************************/void SPI2_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDefSPI_InitStructure;/* SPIμ?IO?úoíSPIíaéè′ò?aê±?ó */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);/* SPIμ?IO?úéè?? */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);/***************************************************************************//************************* éè??SPIμ?2?êy ***********************************//***************************************************************************/SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//????è???1¤SPI?£ê? SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//?÷?ú?£ê? SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8??SPI SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//ê±?óDü????μ??? SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//?úμú?t??ê±?ó2é?ˉêy?Y SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//Nssê1ó?èí?t???? /* ????2¨ì??ê?¤·??μ?a256 */ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//′ó×??????aê?′?ê? SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Cmd(SPI2, ENABLE); SPI_Init(SPI2, &SPI_InitStructure);}/***************************************************************************** Function Name: SPI1_SetSpeed* Description: éè??SPI1μ?′?ê??ù?è?£* Input: ?ù?è2¨ì??ê·??μ* Output: None* Return: None****************************************************************************/void SPI1_SetSpeed(uint8_t speed){ SPI1->CR1 &= 0xFFC7;SPI1->CR1 |= speed; SPI_Cmd(SPI1, ENABLE); }/***************************************************************************** Function Name: SPI2_SetSpeed* Description: éè??SPI2μ?·??μêy£?ò???±?SPI2μ??ù?è.* Input: Speed£o·??μêy* Output: None* Return: None****************************************************************************/void SPI2_SetSpeed(uint8_t Speed){SPI2->CR1 &= 0xFFC7;SPI2->CR1 |= Speed; SPI_Cmd(SPI2,ENABLE);}/***************************************************************************** Function Name: SPI1_WriteReadData* Description: ê1ó?SPI1D′è?ò???×??úêy?Yí?ê±?áè?ò???×??úêy?Y?£* Input: dat£oòaD′μ?8??êy?Y* Output: None* Return: ?áè?μ?μ?8??êy?Y****************************************************************************/uint8_t SPI1_WriteReadData(uint8_t dat){ uint16_t i = 0;/* μ±·¢?í?o3??÷?? */while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) {i;if(i > 10000){return 0xFF;} }/* ·¢?íêy?Y */SPI_I2S_SendData(SPI1, dat);/* μè′y?óê??o3??÷?a·??? */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);/* ???áè?μ?μ?êy?μ·μ?? */return SPI_I2S_ReceiveData(SPI1);}/***************************************************************************** Function Name: SPI2_WriteReadData* Description: ê1ó?SPI2D′è?ò???×??úêy?Yí?ê±?áè?ò???×??úêy?Y?£* Input: dat£oD′è?μ?êy?Y* Output: None* Return: ?áè?μ?μ?êy?Y** ?áè?꧰ü·μ??0xFF****************************************************************************/uint8_t SPI2_WriteReadData(uint8_t dat){ uint16_t i = 0;/* μ±·¢?í?o3??÷?? */while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) {i;if(i > 10000){return 0xFF;} }/* ·¢?íêy?Y */SPI_I2S_SendData(SPI2, dat);/* μè′y?óê??o3??÷?a·??? */ while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);/* ???áè?μ?μ?êy?μ·μ?? */return SPI_I2S_ReceiveData(SPI2);}
推荐阅读
- 分享千牛工作台中关闭叮咚提示音的操作教程
- 坐高铁有没有充值卡,用铁路工作证和乘车卡坐火车有没有位置坐
- 淘宝美工的主要工作内容是什么 美工是做什么的
- win7看不到工作组其他电脑怎么解决?
- Win10看不到工作组计算机怎么解决?
- 小编教你PS误删了工作区进行恢复的操作教程
- 泰国纸签费是多少钱,如果想在泰国直接用旅游签转工作签要多少费用
- 社区书记如何做好社区工作 如何做好社区工作
- 齿轮油泵工作原理
- 丽水高铁导航,在杭州最好找的工作是什么中型企业一般都在些什么地方