mega16与12位ADC的SPI通信问题请教
俺是初学C初学AVR,现在遇到个问题想各位大侠请教:mega16和12位ADC芯片mcp3204进行SPI通信的时候一直失败,请帮忙看一下程序:
unsigned char Get_mcp3204_val(void)
{
unsigned int i;
unsigned char m;
float j;
i = mcp3204_SPI();
j = (i*5)/4096;
//以下是取转换结果整数部分已验证是否通信成功
m = (unsigned char)j;
return(m);
}
unsigned int mcp3204_SPI(void)
{
static unsigned int temp,temp1;
DDRB =(1<<PB7)|(~(1<<PB6))|(1<<PB5)|(1<<PB4);
PORTB = (1<<PB7)|(1<<PB6)|(1<<PB5)|(1<<PB4);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);//
PORTB &=(~(1<<PB4));//启动通信
// delay(1000);
SPSR = 0x00;
SPDR = 0x07;//发送起始位和SGL,D2位
//temp = SPDR;
while(!SPSR&(1<<SPIF));
// SPSR = 0x00;
temp = SPDR;
// while(!SPSR&(1<<SPIF));
SPSR = 0x00;
SPDR = 0x3f;//发送D1D0
while(!SPSR&(1<<SPIF));
// SPSR = 0x00;
temp = SPDR;//接受高四位
// while(!SPSR&(1<<SPIF));
SPSR = 0x00;
SPDR = 0xff;
while(!SPSR&(1<<SPIF));
// SPSR = 0x00;
temp1 = SPDR;//接受低8位
// while(!SPSR&(1<<SPIF));
PORTB &=(1<<PB4);
temp = (unsigned int)temp<<8;
temp = (unsigned int)((temp|temp1)&0x0fff);
return(temp);
}
mcp的资料:http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_570550.jpg
mcp3204配置位 (原文件名:未命名.jpg)
SPI时序图ourdev_570551.jpg(文件大小:1.23M,只有400K以内的图片才能直接显示) (原文件名:未命名1.jpg)
mcp3204datasheetourdev_570552.pdf(文件大小:1.44M) (原文件名:mcp3204.pdf) 回复【楼主位】flyto
-----------------------------------------------------------------------
软件模拟的,也不行
#include<avr/io.h>
#include"delay.h"
#include"display.h"
#define CS PB4
#define DO PB6
#define DI PB5
#define CLK PB7
unsigned int SPI_mcp3204(void);
int main(void)
{
while(1)
{
unsigned char temp;
unsigned int m,n;
m = SPI_mcp3204();
n = (m*5)/4096;
temp = (unsigned char)n;
display(temp);
}
}
unsigned int SPI_mcp3204(void)
{
unsigned char j;
unsigned int i = 0;
DDRB = 0xbf;
PORTB = 0xff;
//发送启动位和SGL,D2,D1,D0
PORTB &=(~(1 << CS));
PORTB &=(~(1 << CLK));
PORTB &= (1<< DI);//1
PORTB &=(1 << CLK);
asm("nop");
// delay(10000);
PORTB &=(~(1 << CLK));
PORTB &= (1<< DI);//1
PORTB &=(1 << CLK);
asm("nop");
//delay(10000);
PORTB &=(~(1 << CLK));
PORTB &=(~(1 << DI));//0
PORTB &=(1 << CLK);
asm("nop");
//delay(10000);
PORTB &=(~(1 << CLK));
PORTB &=(~(1 << DI));//0
asm("nop");
// delay(10000);
PORTB &=(1 << CLK);
//采样周期
asm("nop");
// delay(10000);
PORTB &=(~(1 << CLK));
asm("nop");
// delay(10000);
PORTB &=(1 << CLK);
//空位
asm("nop");
// delay(10000);
PORTB &=(~(1 << CLK));
asm("nop");
//delay(10000);
PORTB &=(1 << CLK);
//读取转换结果
for(j =12;j > 0; j--)
{
asm("nop");
// delay(10000);
PORTB &=(~(1 << CLK));
asm("nop");
// delay(10000);
i = ((PINB&0x40) >> PB6);
i <<=1;
PORTB &=(1 << CLK);
}
PORTB &= (1 << CS);//拉高片选
i >>= 1;
return(i);
} flyto 发表于 2010-7-25 10:40 static/image/common/back.gif
回复【楼主位】flyto
-----------------------------------------------------------------------
软件模 ...
你好,不知道你的这个问题解决了吗?我现在也要做这个,能不能提供一下你的程序让我参考一下!
页:
[1]