定义usigned char zxb;如果这个变量定义为全局变量,程序没有问题,但如果定义在cs1180_ini()中ICCAVR编译时也没有什么错误提示,在studio调试时就没法操作这个变量(赋值赋不上,鼠标点中变量提醒定义位置是R20,定义为全局变量时定义位置为SRAM),哪位大神帮忙指点一下,程序代码如下:
还有调试时在cs1180_ini()中第一个delay(1);处加断点,然后再运行下去这是读出来的zxb值正确,但如果把断点加在zxb变量赋值语句后,zxb值就不对了。试过很多次了每次都一样,郁闷死了!实在找不出问题在哪里
unsigned char zxb;
void delay(unsigned char d)
{
unsigned char i;
while(d--)
{
i =10;
while(--i);
}
}
void spi_send(unsigned char spi_data)
{
unsigned char bd;
unsigned char spid =0;
spid =spi_data;
//PORTB |=BIT(PB1); //SCLK=1
for(bd=0;bd<8;bd++)
{
if((spid&0x80)==0x80)
PORTB |=BIT(PB3); //SDI置位
else
PORTB &=~BIT(PB3); //SDI清除
spid <<=1; //数据左移(从最高位发起)
PORTB &=~BIT(PB1); //SCLK=0
delay(10);
PORTB |=BIT(PB1); //SCLK=1
delay(10);
}
}
unsigned char spi_read(void)
{
unsigned char temp=0;
unsigned char i;
PORTB |=BIT(PB1); //SCLK=1;
for(i=8;i>0;i--)
{
temp <<=1; //数据移位(高位在前)
PORTB &=~BIT(PB1);
delay(10);
if((PINB&0X04)==0X04) //判断SDO
temp++;
PORTB |=BIT(PB1);
delay(10);
}
return(temp);
}
void cs1180_ini(void)
{
//unsigned char zxb;
PORTB |=BIT(PB1); //SCLK管脚置位
delay(1);
spi_send(0XFE); //发送芯片复位指令(复位指令为0XFE)
delay(200);
spi_send(0X50); //写寄存器指令(从0X00寄存器开始)
spi_send(0x02); //写3个寄存器(从0X00寄存器开始)
spi_send(0x00); //SETUP寄存器(设置可编程增益) 可编程增益:1
spi_send(0x01); //MUX寄存器(正常使用时必须设置为0X01)
spi_send(0x60); //ACR寄存器 数据格式:单极性 采样频率:Fosc/256 不使能输入换冲 输出高位在前 2.5V参考 15HZ输出速率
delay(20);
spi_send(0x12);
spi_send(0x00);
zxb =spi_read();
while(PINB&(1<<PB0)); //DRDY脚状态(0:转换数据可用 1:转换和数据更新进行中)
while(!(PINB&(1<<PB0)));
delay(20);
while(PINB&(1<<PB0));
}
void main(void)
{
WDR();
sys_ini(); //系统初始化
WDR();
cs1180_ini(); //初始化CS1180
SEI(); //开总中断
while(1)
{
;
}
} |