这个问题需要有实物调试,
原因可能有很多,硬件,软件方面。
思路是:
先排除硬件问题,用这个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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)