本帖最后由 fangjikun 于 2013-2-28 11:30 编辑
PIC18F4520控制ATT7022CU,IO模拟SPI,现在7022的工作状态没有问题是正常的
(复位后随意写7022里的一个寄存器,SIG信号变为高,另外11脚REFOUT电压2.33V,也正常)
ABC输入端短接后加AC电(可调),在三个电压输入管脚测电压有65mv(随意加的),但读出全是0
以下是程序:
#define Att7022cu_Cs LATC0
#define Att7022cu_Rst LATA6
#define Att7022cu_Sig RA7
#define Att7022cu_Rf_Sclk LATC3
#define Att7022cu_Rf_Data_Out LATC5
#define Att7022cu_Rf_Data_In RC4
unsigned long Read7022(unsigned char Addr)
{
unsigned char i;
unsigned long Out_Data=0;
Addr &= 0x7f;//bit7=0:读命令,bit7=1:写命令
//bit6--0:地址
Att7022cu_Cs=1;
Att7022cu_Rf_Sclk=0;
Att7022cu_Cs=0;delay();
for(i=8; i>0; i--)
{
Att7022cu_Rf_Sclk=1;
delay();
if(Addr&0x80)
{Att7022cu_Rf_Data_Out=1;}
else
{Att7022cu_Rf_Data_Out=0;}
Att7022cu_Rf_Sclk=0;
delay();
Addr<<=1;
}
delay();//
for(i=24; i>0; i--)
{
Att7022cu_Rf_Sclk=1;
delay();
Out_Data<<=1;
Out_Data |= Att7022cu_Rf_Data_In;
Att7022cu_Rf_Sclk=0;
delay();
}
Att7022cu_Cs=1;
// Out_Data=0x12345678; //等于此值在串口调试助手里能看到低8位的“78”值
return Out_Data;//若直接返回就是全零了
}
void Write7022(unsigned char Addr, unsigned long Out_Data)
{
unsigned char i;
Addr=(Addr&0xbf)|0x80; //bit7=0:读命令,bit7=1:写命令
//即Addr=0b10 000000; 低6位为地址
Att7022cu_Cs=1;
Att7022cu_Rf_Sclk=0;
Att7022cu_Cs=0;
for(i=8; i>0; i--)
{Att7022cu_Rf_Sclk=1;
if(Addr&0x80)
{Att7022cu_Rf_Data_Out=1;}
else
{Att7022cu_Rf_Data_Out=0;}
Addr<<=1;
Att7022cu_Rf_Sclk=0;
}
delay();
for(i=24; i>0; i--)
{Att7022cu_Rf_Sclk=1;
if(Out_Data&0x80)
{Att7022cu_Rf_Data_Out=1;}
else
{Att7022cu_Rf_Data_Out=0;}
Out_Data<<=1;
Att7022cu_Rf_Sclk=0;
}
delay();
Att7022cu_Cs=1;
}
void tx_data(void)
{ unsigned char i;
txbuff[0]=Read7022(0x01);
txbuff[1]=Read7022(0x0d);
txbuff[2]=Read7022(0x0e);
txbuff[3]=Read7022(0x0f);
txbuff[4]=Read7022(0x28)
txbuff[5]=Read7022(0x2d);
txbuff[6]=Read7022(0x2e);
txbuff[7] =Read7022(0x3c);
txbuff[8]=Read7022(0x3d);
EN485=1;delay();//发送状态
for(i=0;i<9;i++)
{
TXREG=txbuff;//发送
while(!TRMT);//asm("nop");//delay();
}
EN485=0;delay();//转为接收状态
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>