完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
连接非常简单 Master-CLK,Master->MOSI 到 Slave->MISO,我们只有一个 Slave,所以我们没有使用 CS。我们只是想接收简单的数据,但我们只会收到各种垃圾。
我们之前经历过崩溃和时钟信号失真,但是,一旦我们禁用 nss 脉冲,这种情况就消失了。但是,我们仍然无法收到有用的数据。 在调试和监控 rxreceive 缓冲区时,就好像根本没有连接一样。只是垃圾。 主时钟和 mosi 信号正在做我们预期的事情。 这通常是一个简单的修复,但是,如果有人知道我们应该从哪里着手解决这个问题,我们将不胜感激! 我们的测试代码如下: #include "main.h" /* 私有变量-------------------------------------------- ----------*/ SPI_HandleTypeDef hspi1; /* 私有函数原型-------------------------------------------- --*/ void SystemClock_Config(void); 静态无效 MX_GPIO_Init(无效); 静态无效 MX_SPI1_Init(无效); /* 用户代码开始 PFP */ uint8_t SpiData_TX [7] = “骨头”; uint8_t SpiData_RX [7]; int 主要(无效) { /* 用户代码开始 1 */ /* 用户代码结束 1 */ /* 单片机配置-------------------------------------------- ----------*/ /* 重置所有外设,初始化 Flash 接口和 Systick。*/ HAL_Init(); /* 用户代码开始初始化 */ /* 用户代码结束初始化 */ /* 配置系统时钟 */ SystemClock_Config(); /* 用户代码开始 SysInit */ /* 用户代码结束 SysInit */ /* 初始化所有配置的外设 */ MX_GPIO_Init(); MX_SPI1_Init(); /* 用户代码开始 2 */ /* 用户代码结束 2 */ /* 无限循环 */ /* 用户代码开始时 */ 而 (1) { HAL_SPI_Receive(&hspi1, SpiData_RX, 8,1000); HAL_延迟(10); } /* 用户代码结束 3 */ } /** * @brief 系统时钟配置 * @retval 无 */ void SystemClock_Config(无效) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** 初始化 CPU、AHB 和 APB 总线时钟 */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICalibrationValue = 0; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; RCC_OscInitStruct.PLL.PLLM = 1; RCC_OscInitStruct.PLL.PLLN = 40; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; 如果 (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { 错误处理程序(); } /** 初始化 CPU、AHB 和 APB 总线时钟 */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 如果 (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { 错误处理程序(); } /** 配置主内部稳压器输出电压 */ 如果(HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1)!= HAL_OK) { 错误处理程序(); } } /** * @brief SPI1初始化函数 * @param 无 * @retval 无 */ 静态无效 MX_SPI1_Init(无效) { /* SPI1参数配置*/ hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_SLAVE; hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY; //SPI_DIRECTION_2LINES_RXONLY SPI_DIRECTION_2LINES hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_HARD_INPUT; // SPI_NSS_SOFT SPI_NSS_HARD_INPUT hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; 如果 (HAL_SPI_Init(&hspi1) != HAL_OK) { 错误处理程序(); } /* 用户代码开始 SPI1_Init 2 */ /* 用户代码结束 SPI1_Init 2 */ } /** * @brief GPIO初始化函数 * @param 无 * @retval 无 */ 静态无效 MX_GPIO_Init(无效) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO 端口时钟使能 */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); /*配置GPIO引脚输出电平*/ /*配置GPIO引脚:PDN_PE10_Pin CSN_PE11_Pin */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } /* 用户代码开始 4 */ /* 用户代码结束 4 */ /** * @brief 此函数在发生错误时执行。 * @retval 无 */ void Error_Handler(无效) { /* 用户代码开始 Error_Handler_Debug */ /* 用户可以添加自己的实现来报告HAL错误返回状态 */ /* 用户代码结束 Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief 报告源文件名和源行号 * 发生 assert_param 错误的地方。 * @param file: 指向源文件名的指针 * @param line: assert_param 错误行源编号 * @retval 无 */ void assert_failed(char *file, uint32_t 行) { /* 用户代码开始 6 */ /* 用户可以添加自己的实现来报告文件名和行号, tex: printf("错误的参数值:文件 %s on line %drn", file, line) */ /* 用户代码结束 6 */ } #endif /* USE_FULL_ASSERT */ |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2452 浏览 1 评论
3159 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1726 浏览 1 评论
3544 浏览 6 评论
5905 浏览 21 评论
883浏览 4评论
1261浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
527浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1244浏览 3评论
1298浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-29 06:09 , Processed in 1.537653 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号