stm32与AD7190通信,程序不能读到值

stm32与AD7190通信,程序不能读到值,第1张

这个问题需要有实物调试,

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

思路是:

先排除硬件问题,用这个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=0i<leni++)

{

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=0i<4i++)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

}

/sendtimebetweenbeatswitha/在LCD12864上显示BPM

}

delay(138)9Set/发送并处理原始脉搏传感器数据

if(QS==true){//fadeRateVariableto255tofadeLEDwithpulse

sendDataToProcessing(BQi++){

delay(1000)}

if(Pressure<100){

beep=0}}

if(BPM<60|BPM>100){

for(i=0i<显示信息4

while(1)

{

sendDataToProcessing(}

}

}

//AD转换结果result

ADC_CONTR&=0xf8/依次执行写入 *** 作

{

putchar(ucStr3[i])

}

for(i=0

_nop_()/延时19.6ms

LCD_disp_list_char(4,DisBuff2)设置ADCCONTR控制寄存器后/S确定发现一个心跳

fadeRate=255,0/voidledFadeToBeat(){

//,BPM)///analogWrite(fadePin,fadeRate)/:GetADCResult

函数功能:获取AD转换结果函数

入口参数,Signal)

sys_init()

beep=1

LCD12864_DisplayOneLine(0x80,ucStr1)//,255)//prefix

QS=false/,IBI),4/resettheQuantifiedSelfflagfornexttime

LCD_disp_list_char(2:BYTEch(通道选择)

返回值:result(枣大A///依次执行写入 *** 作

{

putchar(ucStr2[i])

}

for(i=0、CHS1、CHS0(清除通道选择乎岩搜)

_nop_()//显示信息1

LCD12864_DisplayOneLine(0x90,ucStr2)//keepLEDfadevaluefromgoingintonegativenumbers!

/B}

for(i=0i<3i++)

{

putchar(DisBuff[i])/清除ADC控制寄存器ADCCONTR的CHS2,DisBuff)/16i++)/和心率

sendDataToProcessing(setLEDfadevalue

//,要加4个空 *** 作延时才可以正确读到ADCCONTR寄存器的值

_nop_()4i++)//,4i++){

delay(1000)}

if(BPM<60|BPM>100){

beep=0i<16/i++)//8

}

for(i=0Q/}

/******************************************************************************

函数名称岁历显示信息2

LCD12864_DisplayOneLine(0x88,ucStr3)//ledFadeToBeat()显示信息3

LCD12864_DisplayOneLine(0x98,ucStr4)//i<16}

for(i=0i<

unsignedintGetADCResult(BYTEch)

{unsignedintresult//依次执行写入 *** 作

{

putchar(ucStr1[i])/fadeLED

/i<16fadeRate=constrain(fadeRatei++)///发送一个fadeRate-=15//D转换结果)

备注:无

*******************************************************************************/

_nop_()

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START//开ADC电源,选择AD转换速率,并选择AD通道,开始AD转换

_nop_()//设置ADCCONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADCCONTR寄存器的值

_nop_()

_nop_()

_nop_()

while(!(ADC_CONTR&ADC_FLAG))//等待AD转换结束

ADC_CONTR&=~ADC_FLAG//关闭ADC

result=ADC_RES//将AD转换结果的高两位赋给result

result=result<<8//将result循环左移8位

result+=ADC_RESL//将AD转换结果的底8位加高两位共10位给result

returnresult//返回10位AD转换结果

}

voidsendDataToProcessing(charsymbol,intdat){

putchar(symbol)//symbolprefixtellsProcessingwhattypeofdataiscoming

printf(\"%drn


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8200242.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存