调了好久,终于通了。。为什么用了一周时间这么久?主要原因是我不知道隔离模块有问题,导致一直是盲目的改代码,今天没办法,直接把隔离模块短路,一下子就读出了ID号。
7792挂在SPI2上,PB12,PB13,PB14,PB15,可我用SPI调的时候一直读出来是0XFF,以为是SPI2有问题,于是我直接抛弃SPI,用时序直接读。很好用!!!
下面是我的代码:
#define SCLOCK1 GPIO_SetBits(GPIOB,GPIO_Pin_13);
#define SCLOCK0 GPIO_ResetBits(GPIOB,GPIO_Pin_13);
#define CS1 GPIO_SetBits(GPIOB,GPIO_Pin_12);
#define CS0 GPIO_ResetBits(GPIOB,GPIO_Pin_12);
#define DIN1 GPIO_SetBits(GPIOB,GPIO_Pin_15);
#define DIN0 GPIO_ResetBits(GPIOB,GPIO_Pin_15);
#define DOUT1 GPIO_SetBits(GPIOB,GPIO_Pin_14);
#define DOUT0 GPIO_ResetBits(GPIOB,GPIO_Pin_14);
void Delay(unsigned int Time)
{
while(Time)
{
Time--;
}
}
unsigned char DataRead[ 3];
void WriteToReg(unsigned char ByteData) // write ByteData to the register
{
unsigned char temp;
int i;
CS0;
temp= 0x80;
for(i= 0;i< 8;i++)
{
if((temp & ByteData)== 0)
{
DIN0;
}
else
{
DIN1;
}
SCLOCK0;
Delay( 10);
SCLOCK1;
Delay( 10);
temp=temp>> 1;
}
CS1;
}
void ReadFromReg(unsigned char nByte) // nByte is the number of bytes which need to be read
{
int i,j;
unsigned char temp;
DIN1;
CS0;
temp= 0;
// DOUT1;
for(i= 0; i<nByte; i++)
{
for(j= 0; j< 8; j++)
{
SCLOCK0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)== 0)
{
temp=temp<< 1;
} else
{
temp=temp<< 1;
temp=temp+ 0x01;
}
Delay( 10);
SCLOCK1;
Delay( 10);
}
DataRead[i]=temp;
temp= 0;
}
CS1;
}
extern void SSD1305_ShowASC16(u8 x,u8 y,u8 len,unsigned char *str);
void task_7792( void* parameter)
{
char str[ 20];
short iData[ 3];
int ResetTime;
/* PRECONFIGURE... */
ResetTime= 32;
SCLOCK1;
CS0; // to keep DIN=1 for 32 sclock to reset the part
DIN1;
while(ResetTime--)
{
Delay( 10);
SCLOCK0;
Delay( 10);
SCLOCK1;
}
CS1;
while( 1)
{
WriteToReg( 0x10); // write to Communication register.The next step is writing to Configuration register.
WriteToReg( 0x00); // set the Configuration bipolar mode.Gain=1.
WriteToReg( 0x80); // Configuration internal reference selected.
WriteToReg( 0x08); // write to Communication register.The next step is writing to Mode register.
WriteToReg( 0x20); // set the mode register as single conversion mode.
WriteToReg( 0x00); // inter 64 kHZ clock.internal clock is not available at the clk pin.
WriteToReg( 0x40); // write to Communication register.The next step is to read from Status register.
ReadFromReg( 1);
while((DataRead[ 0]& 0x80)== 0x80) // wait for the end of convertion by polling the status register RDY bit
{
WriteToReg( 0x40);
ReadFromReg( 1);
}
WriteToReg( 0x58); // write to Communication register.The next step is to read from Data register.
// WriteToReg(0x60) ;
ReadFromReg( 2);
memcpy(&iData[ 0],&DataRead[ 0], 2);
sprintf(str, " %d ",iData[ 0]);
SSD1305_ShowASC16( 10, 20, 6,str) ;
// printf("Data:%02BX %02BX\r\n",DataRead[0],DataRead[1]); }
}
#define SCLOCK0 GPIO_ResetBits(GPIOB,GPIO_Pin_13);
#define CS1 GPIO_SetBits(GPIOB,GPIO_Pin_12);
#define CS0 GPIO_ResetBits(GPIOB,GPIO_Pin_12);
#define DIN1 GPIO_SetBits(GPIOB,GPIO_Pin_15);
#define DIN0 GPIO_ResetBits(GPIOB,GPIO_Pin_15);
#define DOUT1 GPIO_SetBits(GPIOB,GPIO_Pin_14);
#define DOUT0 GPIO_ResetBits(GPIOB,GPIO_Pin_14);
void Delay(unsigned int Time)
{
while(Time)
{
Time--;
}
}
unsigned char DataRead[ 3];
void WriteToReg(unsigned char ByteData) // write ByteData to the register
{
unsigned char temp;
int i;
CS0;
temp= 0x80;
for(i= 0;i< 8;i++)
{
if((temp & ByteData)== 0)
{
DIN0;
}
else
{
DIN1;
}
SCLOCK0;
Delay( 10);
SCLOCK1;
Delay( 10);
temp=temp>> 1;
}
CS1;
}
void ReadFromReg(unsigned char nByte) // nByte is the number of bytes which need to be read
{
int i,j;
unsigned char temp;
DIN1;
CS0;
temp= 0;
// DOUT1;
for(i= 0; i<nByte; i++)
{
for(j= 0; j< 8; j++)
{
SCLOCK0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)== 0)
{
temp=temp<< 1;
} else
{
temp=temp<< 1;
temp=temp+ 0x01;
}
Delay( 10);
SCLOCK1;
Delay( 10);
}
DataRead[i]=temp;
temp= 0;
}
CS1;
}
extern void SSD1305_ShowASC16(u8 x,u8 y,u8 len,unsigned char *str);
void task_7792( void* parameter)
{
char str[ 20];
short iData[ 3];
int ResetTime;
/* PRECONFIGURE... */
ResetTime= 32;
SCLOCK1;
CS0; // to keep DIN=1 for 32 sclock to reset the part
DIN1;
while(ResetTime--)
{
Delay( 10);
SCLOCK0;
Delay( 10);
SCLOCK1;
}
CS1;
while( 1)
{
WriteToReg( 0x10); // write to Communication register.The next step is writing to Configuration register.
WriteToReg( 0x00); // set the Configuration bipolar mode.Gain=1.
WriteToReg( 0x80); // Configuration internal reference selected.
WriteToReg( 0x08); // write to Communication register.The next step is writing to Mode register.
WriteToReg( 0x20); // set the mode register as single conversion mode.
WriteToReg( 0x00); // inter 64 kHZ clock.internal clock is not available at the clk pin.
WriteToReg( 0x40); // write to Communication register.The next step is to read from Status register.
ReadFromReg( 1);
while((DataRead[ 0]& 0x80)== 0x80) // wait for the end of convertion by polling the status register RDY bit
{
WriteToReg( 0x40);
ReadFromReg( 1);
}
WriteToReg( 0x58); // write to Communication register.The next step is to read from Data register.
// WriteToReg(0x60) ;
ReadFromReg( 2);
memcpy(&iData[ 0],&DataRead[ 0], 2);
sprintf(str, " %d ",iData[ 0]);
SSD1305_ShowASC16( 10, 20, 6,str) ;
// printf("Data:%02BX %02BX\r\n",DataRead[0],DataRead[1]); }
}
嗯。出来了。。。。下面 就是自己配置寄存器,看读出来是哪个通道的值!