ATMEGA32读写CS5460A
大家好!请问单片机与CS5460A连接脚SDO,SDI,CS,SCLK,RESET需要加上拉电阻吗?用89C58单片机读写CS5460A一切正常,现用ATMEGA32读写CS5460A就没反应,DRDY也读不到。不知道什么原因,请大虾帮忙分析下? 既然89C58没问题一切正常,移植过来应该不会有问题啊,配置好AVR的GPIO端口,输入输出的,好好查查,贴程序 输入输出口也设置了,CS5460A就是不工作。 用示波器观察数据线波形,看有无异常 用的模拟还是硬件的,模拟的话,就把那些delay延时放大或缩小。读取部分的程序, 你的时钟还没拉高呢,怎么就读输入口了呢?
for(i=3;i>0;i--)
{
for(j=7;j!=0xFF;j--)
{
SCLK_L();
_delay_us(5);
if(SDO == 1)
*ptr |= (1<<j);
else
*ptr &= ~(1<<j);
if(j==0)
SDI_L();
else
SDI_H();
_delay_us(5);
SCLK_H(); //拉高之后,主机数据移出,从机数据移入,检测输入端口
_delay_us(5);
}
ptr++;
}
另外的参考:
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0; i<8; i++) // 循环8次
{
MOSI = (byte & 0x80); // byte最高位输出到MOSI
byte <<= 1; // 低一位移位到最高位
SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据///////拉高之后,读取MISO电平
byte |= MISO; // 读MISO到byte最低位
SCK = 0; // SCK置低
}
return(byte); // 返回读出的一字节
}
感谢各位的回复。错误出在 if(SDO == 1)改成 if( SDO ).时序可根据6楼的意见修改,也可以不改,因为根据CS5460A读写时序图SCLK置低后大于t8(50ns)时间数据SDO就已经建立。 嗯啊,#defineSDO (PINC & (1<<SPI_SDO)) //PC6
SDO是8位,非零就行了,==1,反而不对了,应该是 if(SDO == 0x40)也行,
要是IAR编写的话,if(PINC_PINC6)或者 if(1==PINC_PINC6)都可以了
ATMEGA32优势现货供应电话13717076781侯斌 QQ657290025 ATMEGA32优势现货供应电话13717076781侯斌 QQ657290025 CS5460A能不能测试出电路的有功功率和无功功率,及电流啊 学习了! ok
页:
[1]