你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个STM32F2的SPI2主模式驱动OK

[复制链接]
caizhiwei 发布时间:2015-2-3 16:57
特别注意NSS引脚的配置,见代码。
1.GPIO的配置与103系列的不同;
2.SPI功能更强大,比如支持CRC校验,配置与103系列不同;
其他特性请参考datasheet.
  1. /*******************************************************************************
  2. //STM32F207VGT6 FOR ENC28J60
  3. //SPI2初始化/IO初始化等
  4. //SPI configuration
  5. @@ JUST FOR STM32F2XX
  6. *******************************************************************************/
  7. void ENC28J60_SPI2_Init(void)
  8. {
  9.     SPI_InitTypeDef  SPI_InitStructure;
  10.     GPIO_InitTypeDef  GPIO_InitStructure;

  11.      /*!< Enable the SPI2 clock */       
  12.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

  13.     /*!< Enable GPIO clocks */
  14.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  15.     /*!< SPI2 pins configuration */
  16.    
  17.      /* Configure SPI2 pins as alternate function (No need to
  18.      configure PB12 since NSS will be managed by software) */  
  19.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); //nss
  20.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
  21.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //miso
  22.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi
  23.    
  24.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  25.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // also 100Mhz
  26.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  27.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; // GPIO_PuPd_DOWN
  28.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  29.     GPIO_Init(GPIOB, &GPIO_InitStructure);// PB13/14/15-SCK,MISO,MOSI
  30.       
  31.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  32.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  33.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  34.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12; // RESRT and CS for enc28j60
  36.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  37.   
  38.     /*!< Configure enc28j60 interrupt pin in PullUp mode ********************/
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  40.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  41.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  42.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  43.     /*!< SPI2 pin configuration */
  44.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //INT
  45.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  46.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
  47.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
  48.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
  49.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
  50.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
  51.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//(SPI_NSS_Soft)此时NSS引脚可以配置成普通GPIO去控制从设备
  52.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//Fclk/2
  53.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; /* Initialize the SPI_FirstBit member */
  54.     SPI_InitStructure.SPI_CRCPolynomial=7;
  55.     SPI_Init(SPI2, &SPI_InitStructure);
  56.     SPI_Cmd(SPI2, ENABLE);

  57. }

  58. /*******************************************************************************
  59. * Function Name  : SPI_ReadWriteByte
  60. * Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
  61. * Input          : unsigned char TxData
  62. * Output         : None
  63. * Return         : unsigned char RxData
  64. *******************************************************************************/
  65. unsigned char SPI2_ReadWriteByte(unsigned char TxData)
  66. {
  67.     unsigned char RxData = 0;
  68.     /* Wait till Transmit buffer is empty */
  69.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  70.     /* Send A data */       
  71.     SPI_I2S_SendData(SPI2, TxData);
  72.     // while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
  73.     //等待数据接收
  74.     while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  75.     //取数据
  76.     RxData = SPI_I2S_ReceiveData(SPI2);
  77.     return (unsigned char)RxData;
  78. }


复制代码


收藏 1 评论3 发布时间:2015-2-3 16:57

举报

3个回答
北斗光寒 回答时间:2015-2-3 19:14:49
这个用来做什么的?
caizhiwei 回答时间:2015-2-3 19:28:41
驱动你的spi外设~
abb200628 回答时间:2015-2-3 20:40:53
好资料,谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版