這個問題需要有實物調試,
原因可能有很多,硬件,軟件方面。
思路是:
先排除硬件問題,用這個SPI通道測試壹下其他通訊
再仔細對照壹下AD7190的規格書,看看初始化,設置是否正確,
然後再檢查壹下發送接收的過程和步驟是否正確。
整理壹下代碼:
void?SPI_Init(void){
?RCC->APB2ENR|=1<<3; //PB的時鐘使能
?RCC->APB1ENR|=1<<14; //SPI2時鐘使能
?GPIOB->CRH&=0X000F0FFF; //PB11?PB13?PB15復用推挽?PB14浮空輸入
?GPIOB->CRH|=0XB4B0B000;
?GPIOB->ODR|=1<<11; //上拉
?GPIOB->ODR|=1<<13;
?GPIOB->ODR|=1<<15;
?SPI2->CR1|=0<<10;? //全雙工
?SPI2->CR1|=1<<9;? //軟件SSM,NSS引腳的電平由SSI位的值決定
?SPI2->CR1|=1<<8;? //SSI位
?SPI2->CR1|=1<<2;? //配置為主設備
?SPI2->CR1|=0<<11;? //使用8位數據格式
?SPI2->CR1|=1<<1; ? //空閑狀態sck=1保持高電平
?SPI2->CR1|=1<<0; ? //數據采樣從第二個時鐘邊沿開始
?SPI2->CR1|=3<<3;? ?//fsck=36M/16?波特率控制
?SPI2->CR1|=0<<7; //先發送MSB?
?SPI2->CR1|=1<<6; //使能spi設備
}
void?SPI2_Send_ReveiceFull(u8?*data,u8?len)
{
CS=0;
for(i=0;i<len;i++)
{
while((SPI2->SR&(1<<1))==0); //檢查spi標誌位設置與否,發送緩存空標誌位TXE=1為空跳出
SPI2->DR=*(data+i);
while((SPI2->SR&(1<<0))==0); //檢查指定spi標誌位設置與否,接受緩存非空標誌位RXNE為非空跳出
temp=SPI2->DR;
*(AD7190_ReveiceData+len-i-1)=temp;
}
CS=1;
}
void?AD7190_Init(void)
{
//復位
AD7190_SendaData[2]=0xff;
AD7190_SendaData[1]=0xff;
AD7190_SendaData[0]=0xff;
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
//設置配置寄存器
AD7190_SendaData[0]=0x10;
SPI2_Send_ReveiceFull(AD7190_SendaData,1);
AD7190_SendaData[2]=0x10; ?//基準電壓選擇需確定
AD7190_SendaData[1]=0x03; //通道選擇需配置
AD7190_SendaData[0]=0x07; //輸入範圍?
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
//設置模式寄存器
AD7190_SendaData[0]=0x08;
SPI2_Send_ReveiceFull(AD7190_SendaData,1);
AD7190_SendaData[2]=0x10; //使用外部時鐘
AD7190_SendaData[1]=0x03;
AD7190_SendaData[0]=0xff;
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
//讀模式
for(i=0;i<4;i++)AD7190_SendaData[i]=0x00;
AD7190_SendaData[0]=0x48;
SPI2_Send_ReveiceFull(AD7190_SendaData,1);
AD7190_SendaData[0]=0x00;
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
//讀配置寄存器
AD7190_SendaData[0]=0x50;
SPI2_Send_ReveiceFull(AD7190_SendaData,1);
SPI2_Send_ReveiceFull(AD7190_SendaData,3);
//讀數據寄存器
AD7190_SendaData[0]=0x5C; //5C
SPI2_Send_ReveiceFull(AD7190_SendaData,1);
AD7190_SendaData[0]=0xff;
}