當前位置:編程學習大全網 - 編程語言 - stm32與AD7190通信,程序不能讀到值

stm32與AD7190通信,程序不能讀到值

這個問題需要有實物調試,

原因可能有很多,硬件,軟件方面。

思路是:

先排除硬件問題,用這個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;

}

  • 上一篇:編程竊取個人信息
  • 下一篇:求C++編程題目答案!!!設計壹個學生類(CStudent),它具有的私有數據成員是註冊號、姓名、數學、外語、計
  • copyright 2024編程學習大全網