uint8_t ADS1255_write_byte(uint8_t data)
{
while(SPI1->SR&1<<1==0)//发送缓冲器非空,等待
SPI1->DR=data; //发送一个byte
while((SPI1->SR&1<<0)==0);//等待接收完一个byte ,运行这步就过不去了
//delay_us(1);
return SPI1->DR; //返回收到的数据,此时的数据是1255回传的数据
}
SPI通信,向发送缓冲区写入data,此时1255肯定回传数据到STM32接收缓冲区,那就不该为空啊,看到网上有很多人遇到这个问题,有人说上面程序逻辑有问题,我认为没问题,下面是我对相应引脚的配置:
void SPI1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//RCC中已经开启GPIOA口时钟
/*SPI引脚配置复用推挽输出PA5-SCK、PA7-MOSI*/
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*SPI引脚配置上拉输入PA6-MISO*/
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI引脚配置推挽输出 PA4-SPI_NSS */
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI引脚配置浮空输入 PA3-DRDY */
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3; //PA3不设置可能也没问题,复位后处于浮空状态,其电平状态由外围电路决定
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*SPI1模式设置*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI 设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI_Mode_Master
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI 发送接收8 位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟空闲为0
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //内部NSS 信号有SSI 位控制
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_256; //波特率预分频值为256,PLLCLK为56M,此时SPI1为218.75K,注意不能超过18M
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
尝试着将等待接收字节注释,以1us延时代替,读取1255几个重要寄存器的返回值还是不对,请大神帮忙看看有没有问题
|