这样配置SPI引脚

然后这样配置SPI参数

生成立这样的配置代码

/* SPI2 init function */
static void MX_SPI2_Init(void)
{

/* SPI2 parameter configuration*/
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLE;
hspi2.Init.CRCPolynomial = 14;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}

}

然后它的SPI引脚是这样的代码

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI2)
{
/* USER CODE BEGIN SPI2_MspInit 0 */

/* USER CODE END SPI2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI2_CLK_ENABLE();

/**SPI2 GPIO Configuration
PB12 ------> SPI2_NSS
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
PB15 ------> SPI2_MOSI
*/
GPIO_InitStruct.Pin = Z_CSN_Pin|Z_SCK_Pin|Z_SDI_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = Z_SDO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(Z_SDO_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN SPI2_MspInit 1 */

/* USER CODE END SPI2_MspInit 1 */
}

}

注意Z_CSN_Pin配置成了AF模式。

所以收发函数想要这样用:

uint8_t d_read,d_send;

HAL_SPI_TransmitReceive(&hspi2,&d_send,&d_read,1,0xFFF);

结果是:这个收发语句执行了,但用示波器看Z_CSN_Pin并没有在执行过程中自动拉低!自然是不能收发成功的。

hspi2.Init.NSS = SPI_NSS_SOFT;这个语句的含义并不是NSS软件自动控制?!

不得已,只好在初始化后重新定义Z_CSN_Pin:

void MX_SPI2_Init_IO_ReDefine(void)
{

GPIO_InitTypeDef GPIO_InitStruct;

/**SPI GPIO Configuration
*/
GPIO_InitStruct.Pin = Z_CSN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

然后收发时加上Z_CSN_Pin拉低和拉高!

/**
* 函数功能: 从SPI发送4个字节数据
* 输入参数: 无
* 返 回 值: uint32_t:读取到的数据
* 说 明:This function must be used only if the Start_Read_Sequence
* function has been previously called.
*/
uint32_t M1_SPI0SndByte(uint32_t data)
{
uint32_t x=0;
uint8_t d_read[4],d_send[3]={0};
HAL_GPIO_WritePin (GPIOB, Z_CSN_Pin, GPIO_PIN_RESET);
// HAL_Delay(1);
d_send[0]=(data>>16)&0xff;
d_send[1]=(data>>8)&0xff;
d_send[2]=(data)&0xff;
if(HAL_SPI_TransmitReceive(&hspi2,d_send,d_read,3,0xFFF)!=HAL_OK)
x=0xffffffff;
HAL_GPIO_WritePin (GPIOB, Z_CSN_Pin, GPIO_PIN_SET);
// HAL_Delay(1);
return x;
}

这才成功!

最新文章

  1. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
  2. .NET Core采用的全新配置系统[2]: 配置模型设计详解
  3. 在Ubuntu上搭建Hadoop群集
  4. HTML DOM prompt() 方法
  5. java-集合3
  6. Oracle存储过程记录异常
  7. sacc scss less
  8. 在页面头部<!DOCTYPE html ....> 前面不能有任何输出
  9. eclipse配置PHP开发环境
  10. HDU 3667 费用流(拆边)
  11. ML 04、模型评估与模型选择
  12. C基础--结构体成员初始化方式
  13. 01-08-04【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之命名缓存
  14. 0ull 是什么意思?
  15. eclipse 导入项目时候java版本不一致问题
  16. 【SQL】查询语句中in和exists的区别
  17. C#学习基础总结
  18. 三个C++资源链接(大量)
  19. PHP图像处理:3D图纸、缩放、回转、剪下、水印(三)
  20. HttpServletResponse addHeader() 与 setHeader() 区别

热门文章

  1. App后台开发架构实践笔记
  2. mysql导入导出csv
  3. SQL 根据身份证号码获取年龄的函数
  4. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上
  5. python入门23 pymssql模块(python连接sql server增删改数据 )
  6. URI和URL有什么区别
  7. Django运行访问项目出现的问题:Invalid HTTP_HOST header: '192.168.114.25:8001'. You may need to add u'192.168.114.25' to ALLOWED_HOSTS.
  8. @Modules( ... ) 多个包路径问题
  9. hdu-1754 I Hate It---线段树模板题
  10. Python:IPC-Pipe与IPC-Manger