qhcmcu 发表于 2016-10-26 16:03

ATMEGA32读写CS5460A

大家好!请问单片机与CS5460A连接脚SDO,SDI,CS,SCLK,RESET需要加上拉电阻吗?用89C58单片机读写CS5460A一切正常,现用ATMEGA32读写CS5460A就没反应,DRDY也读不到。不知道什么原因,请大虾帮忙分析下?

fankaimrk 发表于 2016-10-26 20:57

既然89C58没问题一切正常,移植过来应该不会有问题啊,配置好AVR的GPIO端口,输入输出的,好好查查,贴程序

qhcmcu 发表于 2016-10-27 10:24

输入输出口也设置了,CS5460A就是不工作。

ningling_21 发表于 2016-10-27 10:37

用示波器观察数据线波形,看有无异常

杨爱林林 发表于 2016-10-27 11:06

用的模拟还是硬件的,模拟的话,就把那些delay延时放大或缩小。

fankaimrk 发表于 2016-10-27 13:58

读取部分的程序, 你的时钟还没拉高呢,怎么就读输入口了呢?
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);            // 返回读出的一字节
}

qhcmcu 发表于 2016-10-28 09:32

感谢各位的回复。错误出在 if(SDO == 1)改成 if( SDO ).时序可根据6楼的意见修改,也可以不改,因为根据CS5460A读写时序图SCLK置低后大于t8(50ns)时间数据SDO就已经建立。

fankaimrk 发表于 2016-10-28 11:48

嗯啊,#defineSDO      (PINC & (1<<SPI_SDO)) //PC6
SDO是8位,非零就行了,==1,反而不对了,应该是 if(SDO == 0x40)也行,
要是IAR编写的话,if(PINC_PINC6)或者 if(1==PINC_PINC6)都可以了


houbin1234 发表于 2017-5-9 11:22

ATMEGA32优势现货供应电话13717076781侯斌       QQ657290025

houbin1234 发表于 2017-5-9 11:23

ATMEGA32优势现货供应电话13717076781侯斌       QQ657290025

sanzi666 发表于 2021-4-16 15:03

CS5460A能不能测试出电路的有功功率和无功功率,及电流啊

zwsam 发表于 2022-6-1 09:10

学习了!

zwsam 发表于 2022-6-2 13:06

ok
页: [1]
查看完整版本: ATMEGA32读写CS5460A