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

}

接线:p3.6接srd

p3.7接swr

p3.0接pin

p3.1接clk

ad0809的clk接脉冲

cs接8000h的译码电路程序:ad0809 xdata 8000h

org 0000h

ajmp main

org 0030h

main:mov dptr,#8000h

mov a,#01h

movx @dptr,a

call delay

movx a,@dptr

mov r0,a

call disp

call delay

call delay

call delay

ajmp maindisp:mov a,r0

anl a,#00001111b

acall dsend

mov a,r0

swap a

anl a,#00001111b

acall dsend

ret

dsend:mov dptr,#tab

movc a,@a+dptr

mov sbuf,a

jnb ti,$

clr ti

ret delay:mov r4,#250

delay1:mov r5,#250

djnz r5,$

djnz r4,delay1

ret

tab:db 03h 0

db 9fh 1

db 25h 2

db 0dh 3

db 99h 4

db 49h 5

db 41h 6

db 1fh 7

db 01h 8

db 09h 9

db 11h 灭

db 11h

db 0c1h

db 63h

db 85h

db 61h

db 71h

db 00h

end

AD0809的采集程序

//---A/D转换---

//-----头文件引用------

#include <Reg51.h>

#include <absacc.h>

#include <intrins.h>

typedef unsigned char BYTE/*自定义字节类型*/

#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/

#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/

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

void Write_Hd7279(BYTE,BYTE)/*定义HD7279写函数*/

BYTE Read_Hd7279(BYTE)/*定义HD7279读函数*/

void Send_Byte(BYTE)/*定义HD7279发送字节函数*/

BYTE Receive_Byte(void)/*定义HD7279接收字节函数*/

void Short_Delay(void)/*定义短延时函数*/

void Long_Delay(void)/*定义长延时函数*/

void Mcu_Init(void)/*定义MCU初始化函数*/

void Delay_200_mS(void)/*定义200ms延时函数*/

sbit Hd7279_Clk=P1^6/*定义HD7279时钟硬件连接*/

sbit Hd7279_Data=P1^5/*定义HD7279数据硬件连接*/

sbit cs=P1^7

void Short_Delay(void) /*短延时函数*/

{

BYTE i

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

}

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

void Long_Delay(void) /*长延时函数*/

{

BYTE i

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

}

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

void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/

{

Send_Byte(Command)

Send_Byte(Data)

}

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

void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/

{

BYTE i

cs=0

Long_Delay()

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

{

if(Data_Out&0x80) Set_Bit(Hd7279_Data)

else Clear_Bit(Hd7279_Data)

Set_Bit(Hd7279_Clk)

Short_Delay()

Clear_Bit(Hd7279_Clk)

Short_Delay()

Data_Out=Data_Out<<1

}

Clear_Bit(Hd7279_Data)

}

//-----宏声明-----

#define A_DPORT XBYTE[0xFef3]//0809通道0地址

#define uchar unsigned char

//-----变量定义-----

bit bdata bz=0//定义标志

uchar val

//-----初始化-----

void first(void)

{

P1=0xff

P2=0xff

P3=0xff

P0=0xff

Send_Byte(0xa4)

IT1=1

EX1=1

EA=1//INT0 允许

}

//-----中断-----

void int_0(void) interrupt 2

{

val=A_DPORT//读 A_D 数据

bz=1//置读数标志

}

//-----主程序-----

main()

{

first()//初始化

while(1)

{

A_DPORT=val//启动 A_D

while(bz==0)//等待 A_D 转换结束

// val=~A_DPORT

//P1=val//数据输出

Write_Hd7279(0xc8,val&0x0f)

Write_Hd7279(0xc9,val>>4)

Write_Hd7279(0x92,0x00)

Write_Hd7279(0x93,0x00)

Write_Hd7279(0x94,0x00)

Write_Hd7279(0x95,0x00)

Write_Hd7279(0xce,0x0d)

Write_Hd7279(0xcf,0x0a)

bz=0//清读数标志

}

}

这就是C的程序

http://hi.baidu.com/dzkfw/blog/item/4a188216fd986b12c83d6d05.html

不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。

1、最新版单片机编程宝典下载地址,学习单片机编程必备手册

2、单片机c语言运用例子

3、十天学会单片机c语言和单片机制作,最好的单片机资料


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存