经过比较,终于发现了问题。现在的结果是正确的了。
现把修改后的测试通过了的程序贴在下面,敬请继续讨论。
有问题的是两个地方,一个是先移位再读取;二是先得到的是LSB,所以应该是右移,再判断|0X80。
#include <msp430x14x.h>
//#define DELTA 256 // target DCO = DELTA*(4096) = 1048576
#define DELTA 244 // target DCO = DELTA*(4096) = 1048576
unsigned char err_flag=0;
//unsigned char result=0;
//unsigned char result1=0;
volatile unsigned int result[9];
volatile unsigned char crc8;
void Set_DCO (void);
void delay(unsigned int dd);
void delay1(unsigned char dd1);
void reset(void);
void write_command(unsigned char command);
//unsigned char read_data(void);
unsigned int read_data(void);
// TEST BUILD
static unsigned char dscrc_ta××e[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
//--------------------------------------------------------------------------
// Calculate the CRC8 of the byte value provided with the current
// global 'crc8' value.
// Returns current global crc8 value
//
unsigned char docrc8(unsigned char value)
{
// See Application Note 27
// TEST BUILD
crc8 = dscrc_ta××e[crc8 ^ value];
return crc8;
}
void main(void)
{
unsigned int lpmain;
crc8 = 0;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
Set_DCO(); // Set DCO
/*P1DIR |= 0x01; // Set P1.0 to output direction
for (;;)
{
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
delay(250000);
}*/
P1OUT |= BIT3;
P1DIR |= BIT3;
while(1)
{
reset();
write_command(0xcc);
write_command(0x44);
delay1(6);
crc8 = 0;
reset();
//write_command(0xcc);
//write_command(0xBE);
write_command(0x33);
for(lpmain=0;lpmain<8;lpmain++)
{
result[lpmain] = read_data();
if(lpmain<7)docrc8(result[lpmain]);
}
_NOP();
crc8 = 0;
reset();
write_command(0xcc);
write_command(0xBE);
for(lpmain=0;lpmain<9;lpmain++)
{
result[lpmain] = read_data();
if(lpmain!=8)docrc8(result[lpmain]);
}
_NOP();
result[1] = 0;
}
}
void reset(void)
{
P1OUT &= ~BIT3;
delay(150);
P1DIR &= ~BIT3;
//************************
/*delay(3);
delay(15);
if(P1IN&BIT3)
{err_flag = 1;}
else err_flag =0;*/
//*****************************
delay(9);
if(P1IN&BIT3)
{err_flag = 1;}
else err_flag =0;
delay(125);
P1OUT |= BIT3;
P1DIR |= BIT3;
}
void write_command(unsigned char command)
{
unsigned char i;
for(i=0;i<8;i++)
{
P1OUT &= ~BIT3;
if(command&0x01)
{
//delay(2);
_NOP();
_NOP();
_NOP();
_NOP();
//P1OUT |= BIT3;
P1DIR &= ~BIT3;
}
command=command>>1;
//delay(15);
delay(20);
//P1OUT |= BIT3;
P1DIR &= ~BIT3;
delay(3);
P1OUT |= BIT3;
P1DIR |= BIT3;
}
}
unsigned int read_data(void)
//unsigned int read_data(void)
{
//unsigned char data=0,i;
unsigned int data=0;
unsigned int i;
//data = 0;
for(i=0;i<8;i++)
//for(i=0;i<16;i++)
{
P1OUT &= ~BIT3;
_NOP();
_NOP();
_NOP();
P1DIR &= ~BIT3;
_NOP();
data = data>>1;
if(P1IN&BIT3)
{data |= 0x80;}
//{data |= 0x01;}
delay(23);
P1OUT |= BIT3;
P1DIR |= BIT3;
}
return data;
}
void delay(unsigned int dd)
{
unsigned int i;
for(i=0;i<dd;i++);
}
void delay1(unsigned char dd1)
{
unsigned char i;
for(i=0;i<dd1;i++)
{
delay(50000);
}
}
void delay_60us(void)
{
register unsigned int i=20;
do{
i=i-1;}while(i);
}
//------------------------------------------------------------------------------
void Set_DCO (void) // Set DCO to selected frequency
//------------------------------------------------------------------------------
{
//#define DELTA 900 // target DCO = DELTA*(4096) = 3686400
//#define DELTA 256 // target DCO = DELTA*(4096) = 1048576
//#define DELTA 64 // target DCO = DELTA*(4096) = 262144
unsigned int Compare, Oldcapture = 0;
BCSCTL1 |= DIVA_3; // ACLK= LFXT1CLK/8
CCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear
while (1)
{
while (!(CCIFG & CCTL2)); // Wait until capture occured
CCTL2 &= ~CCIFG; // Capture occured, clear flag
Compare = CCR2; // Get current captured SMCLK
Compare = Compare - Oldcapture; // SMCLK difference
Oldcapture = CCR2; // S××e current captured SMCLK
if (DELTA == Compare) break; // If equal, le××e "while(1)"
else if (DELTA < Compare) // DCO is too fast, slow it down
{
DCOCTL--;
if (DCOCTL == 0xFF) BCSCTL1--; // Did DCO role under?, Sel lower RSEL
}
else
{
DCOCTL++;
if (DCOCTL == 0x00) BCSCTL1++; // Did DCO role over? Sel higher RSEL
}
}
delay_60us();
CCTL2 = 0; // Stop CCR2
TACTL = 0; // Stop Timer_A
BCSCTL1 &= ~DIVA_3;
} |