这个问题需要有实物调试,
原因可能有很多,硬件,软件方面。
思路是:
先排除硬件问题,用这个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接srdp3.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语言和单片机制作,最好的单片机资料
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)