|
//我们的SPI速度最高可以达到1.5M左右
//需要注意的是每次CS拉低启动传输,需要给2-3us的延时时间。
//CS拉高结束数据传输之前也需要给出2-3us的延时时间
void Delay(unsigned int time) //一个控制信号高电平低电平时间的延时
{
int i;
for(i=0; i<time; i++);
}
unsigned long SPI_Read(unsigned char address)
{
int i;
unsigned long temp_data;
temp_data = 0;
SPI_CLK_LOW; //确保CLK初始状态是0
Delayus(1);
SPI_CS_HIGH;
Delayus(2);
SPI_CS_LOW;
Delayus(5);
SPI_CLK_HIGH; //启动数据传输
Delayus(1);
SPI_DIN_LOW; //0表示主机向从机读数据
Delayus(1);
SPI_CLK_LOW; //从机需要在下降沿取数据
Delayus(1);
for(i=6; i>=0; i--)
{
SPI_CLK_HIGH; //启动数据传输
Delayus(10);
if( (address& (0x01<<i))>>i)//(address & 0x01)
{
SPI_DIN_HIGH;
}
else
SPI_DIN_LOW;
Delayus(1);
SPI_CLK_LOW; //从机需要在下降沿取数据
Delayus(10);
}
SPI_CLK_HIGH;
Delayus(10);
SPI_CLK_LOW;
if(READ_SPI_DOUT)
temp_data = temp_data | 1;
Delayus(2); //从机接收到命令后,开始送出数据,上升沿送数据
for(i=0; i<23; i++)
{
SPI_CLK_HIGH;
Delayus(10);
SPI_CLK_LOW;
Delayus(10);
temp_data = temp_data<<1;
if(READ_SPI_DOUT)
temp_data++;
Delayus(1);
}
SPI_CS_HIGH;
return temp_data;
}
void SPI_Write(unsigned char address, unsigned long write_data)
{
int i;
unsigned long temp_data;
temp_data = 1;
SPI_CLK_LOW; //确保CLK初始状态是0
Delayus(100);
SPI_CS_HIGH;
Delayus(50);
SPI_CS_LOW;
Delayus(100);
SPI_CLK_HIGH; //启动数据传输
Delayus(10);
SPI_DIN_HIGH; //1表示主机向从机写数据
Delayus(10);
SPI_CLK_LOW; //从机需要在下降沿取数据
Delayus(10);
for(i=6; i>=0; i--)
{
SPI_CLK_HIGH; //启动数据传输
Delayus(10);
if((address & (0x01<<i))>>i)
{
SPI_DIN_HIGH;
}
else
SPI_DIN_LOW;
Delayus(10);
SPI_CLK_LOW; //从机需要在下降沿取数据
Delayus(10);
}
//从机接收到命令后,开始送出数据,上升沿送数据
Delayus(40);
for(i=23; i>=0; i--)
{
SPI_CLK_HIGH; //启动数据传输
Delayus(10);
if((write_data & (temp_data<<i))>>i)
{
SPI_DIN_HIGH;
}
else
SPI_DIN_LOW;
Delayus(10);
SPI_CLK_LOW; //从机需要在下降沿取数据
Delayus(10);
}
SPI_CS_HIGH;
}
void ATT7053_Init(void)
{
SPI_Write(0x32, 0xBC); //Open written-protect 只能操作 40H 到 45H 的校表参数寄存器
SPI_Write(0x43, 0xFA); //I1 ADC Enable
// SPI_Write(0x43, 0xDF); //close bor
SPI_Write(0x42, 0x01FF); //I1Angle Enable, I2Angle Enable
SPI_Write(0x32, 0xA6); //Open written-protect 只能操作 50H 到 71H 的校表参数寄存器
SPI_Write(0x59, 0x0001); //模拟通道增益I1*2
Delayms(10);
SPI_Read(0x06);
}
|
|