你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
xuezhimeng2010 发表于 2017-2-21 16:24 贴上代码来看看
查看全部评分
xuezhimeng2010 发表于 2017-2-21 16:55 或许你的初始化配置有问题,贴出你的spi配置图or代码
xuezhimeng2010 发表于 2017-2-21 17:03 你这个初始化代码调用了么?看下spi1的寄存器
木子-387117 发表于 2017-2-21 17:05 调用啦 MOSI输出数据MISO都有对应的返回数据 而且示波器自己读是正确的
xuezhimeng2010 发表于 2017-2-21 17:15 那看下输入引脚上的配置,一步步看寄存器吧
watershade 发表于 2017-2-21 20:56 是这样的。我看你的SPI两个字节是连续发送。你是用这两个命令之后来实现可以从波形上明显看出中间有一段停 ...
zbber 发表于 2017-2-22 15:27 什么叫实际测试有数据但是采集不到?
木子-387117 发表于 2017-2-21 21:38 首先谢过水影先森的解答~~ 1.确实我访问的器件需要MOSI先给八位地址再给八位数据,然后MISO返回寄存器数 ...
uint8_t liming=0x06;地址
uint8_t liming2=0x00;
uint8_t lmGET_data; 返回数据存放
while(1){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );
HAL_SPI_Transmit(&hspi1,&liming2,sizeof(liming2),1000);
HAL_SPI_Receive(&hspi1,&lmGET_data,sizeof(lmGET_data),1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );
if(lmGET_data==0x6c)
printf("\r\n LoRaOn \r\n");
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_RESET );
HAL_SPI_Transmit(&hspi1,&liming,sizeof(liming),1000);
HAL_SPI_TransmitReceive(&hspi1, &liming2, &lmGET_data, 1, 1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 ,GPIO_PIN_SET );
if(lmGET_data==0x6c)
printf("\r\n LoRaOn \r\n");
}
评分
查看全部评分
/* SPI1 init function */
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = 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_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;//ËÙ¶È×îÂýÊÔÊÔ¿´
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
调用啦 MOSI输出数据MISO都有对应的返回数据 而且示波器自己读是正确的
那看下输入引脚上的配置,一步步看寄存器吧
全速跑起来 keil5里面的工具看寄存器 COPL CPHA 都是0 因为我循环发送接收数据所以BSY TXE时而0时而1 但是RXNE时而0时而1的频率很慢 按理说应该有TXE变化速度一半啊
我觉得问题在于我用示波器检测到MISO返回数据了 而且是正确数据 但是receive函数读不到
首先谢过水影先森的解答~~
1.确实我访问的器件需要MOSI先给八位地址再给八位数据,然后MISO返回寄存器数据,
2.HAL_SPI_TransmitReceive我想到了直接发送两个字节了 把地址和数据一起发出去,但是接收的还是全0
奇怪的是我用示波器测出来是有数据的 而且是正确的 真是诡异
3.CPAL和CPOL设置都为0 检查过了
4.liming2就是简单的 uchar类型
就是示波器我自己测数据 用示波器观察 MISO有返回数据~~~但是receive函数接收存起来一直都是0
{
GPIO_InitTypeDef GPIO_InitStruct;
if(spiHandle->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* USER CODE END SPI1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA4 ------> SPI1_NSS
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT ;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
}
那你试着用中断的方式再读一下。要不就是你MISO管脚的配置有问题。你用官方的例程编译一下试试