主要问题: 通过spi串口传入命令和数据后,出现的现象是,每输入两个值才能有一个输出值.如我程序所示: //ICC-AVR application builder // Target : AT90USB1287 // Crystal: 8.000Mhz
#include <ioUSB1287v.h> #include <macros.h>
#define uchar unsigned char #define unint unsigned int
void SPI_MasterInit(void) { DDRC = 0xff; //PC7 PC6 PC5 // 1 0 1 用于片选 CS DDRE = 0xff; // pe7控制 FS 同步 PORTE&=~BIT(PE7); //DA FS DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2);//0x07; PORTB = BIT(PB0); SPCR = (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(1<<CPHA); }
void SPI_MasterTransmit(uchar cData) { SPDR = cData; while(!(SPSR & (1<<SPIF))) ; } ////////////////////////////////////////////////////////
void WriteDA(unint cDate) { uchar H_date,L_date; L_date = cDate; H_date = cDate>>8; PORTE = BIT(PE7); PORTC = 0xa0; //CS低 PORTE&=~BIT(PE7); //FS低
SPI_MasterTransmit(H_date); //spi传输高字节 SPI_MasterTransmit(L_date); //spi传输低字节
PORTE = BIT(PE7); //FS高 PORTC = 0x00; //CS高 }
////////////////////////////////////////////////////////
void main(void) { SPI_MasterInit(); WriteDA(0xd002); //写入命令 for(;;) { //写入数 WriteDA(0x4fee); //运行的结果显示4fee的变换电压值 asm("nop"); WriteDA(0x4e00); //得不到其对应的电压值 asm("nop"); WriteDA(0x4500); //显示4500的电压值 asm("nop"); WriteDA(0x4a00); //得不到 asm("nop"); } }
时序是根据手册上写的,通过示波器看时序没有错误,写入的数据也没有错误. 但是得到的输出只能是两个.写多个也是一样,只能两个得一个. 参考电压2.048v正常
不知道哪里出了问题了,请大家帮帮忙 谢谢 |