我想通过STM32F103ZET6硬件SPI1与max31865通信 我找了好多资料 方法我能用的方法我都试过了 通过示波器和逻辑分析仪都能抓到发出的信号(MOSI)但是返回的信号就是无法收到正确的信号(MISO) 下面是一些关键的程序和配置 (我怕一大段一大段大家没心情看)
1、RCC配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);
2、SCK、MOSI的GPIO模式设置为AF_PP,速度为50
3、MISO根据参考手册应设置为浮空输入或者上拉输入,我选择上拉输入IPU,速度50
4、CS使用D0来模拟,模式为OUT_PP速度50
5、SCK、MOSI、CS置位
7、SPI配置:
SPI_Direction_2Lines_FullDuplex;SPI_Mode_Master;SPI_DataSize_8b;SPI_CPOL_High;
SPI_CPHA_2Edge; SPI_NSS_Soft; SPI_BaudRatePrescaler_256;SPI_FirstBit_MSB;CRC设置为7(虽然在程序中没用,但是也设置了)
8、SPI_Cmd(SPI1, ENABLE);
9、我看到很多教程上都写了SPIRead(0XFF);这一步,我觉得没什么用
10、SPI读操作
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_CS_LOW();
SPI_I2S_SendData(SPI1, Address);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_CS_HIGH();
return SPI_I2S_ReceiveData(SPI1);
11、SPI写操作
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_CS_LOW();
SPI_I2S_SendData(SPI1, Address);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, Message);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_CS_HIGH();
(以上两部其实很多教程都是这样)
12、主函数流程是SystemInit;SPI和GPIO配置(基本上就是上述的步骤只是多了几条必要的命令),申请了一个unsigned char类型得到data用于接收数据
13、配置MAX31865:具体流程就是向MAX31865的地址0x80写入0xc1,然后在0x00应该能够读取到刚刚写如的0xc1(这一步绝对不会错,我在stc15,树莓派上都已经成功了,不会有问题的)
14、不断循环13步(写配置,读配置)
我找不到问题,但是通过单步调试得到0xff(应该是0xc1),通过在程序中增加判断当data等于0xc1时亮灯,通过示波器(MOSI信号正常,MISO有一个固定的方波),通过逻辑分析仪(解码后MOSI正确,MISO受到0X00)都不能得到正确反馈。为了测试是不是STM32SPI波特率太快我在树莓派上将速度调整为500000,也能正确通信。查找网上资料,有人认为是CS信号太快不够稳定,我有尝试加过一定的延时,依旧无法通信。实在没办法我上某宝找人代做,对方不收,我已经黔驴技穷了,望大神们出手相助。跪谢了
|