MiniCat 发表于 2012-4-5 10:58:09

[求助]AVR MEGA8 与SI4432 SPI通信问题

本帖最后由 MiniCat 于 2012-4-5 11:02 编辑

AVR MEGA8 与SI4432 SPI,现在4432返回来的都是乱码,不知道是什么原因,麻烦各位大侠帮看看。程序如下:
void spi_init(void)
{
SPCR = 0x73;
}
void SpiWriteAddressData(uchar add, uchar data)
{
nSET_CLR;
Delay_us(3);
add|=REG_WRITE;
SPDR=add;
while(!(SPSR&(1<<SPIF)));
SPDR=data;
while(!(SPSR&(1<<SPIF)));
Delay_us(3);
nSET_SET;
}

uchar SpiReadAddressData(uchar add)
{
nSET_CLR;
Delay_us(3);
add&=REG_READ;
SPDR=add;
while(!(SPSR&(1<<SPIF)));
SPDR=0x00;
while(!(SPSR&(1<<SPIF)));
Delay_us(3);
nSET_SET;
return SPDR;
}

端口初始化:
void port_init(void)
{
PORTB = 0x17;
DDRB= 0x2D;
PORTC = 0x00;
DDRC= 0x00;
PORTD = 0x03;
DDRD= 0x76;
}

相关宏定义:
//**********SI4432************//
#define GPIO_0   (PIND & (1<<PD7))
#define IRQ_L   ((PINB & (1<<PB1))==0)
#define IRQ_H   ((PINB & (1<<PB1))==1)

#define SDN_SET   PORTB |=BIT(PB0)         
#define SDN_CLR   PORTB &=~BIT(PB0)
#define nSET_SET    PORTB |=BIT(PB2)         
#define nSET_CLR    PORTB &=~BIT(PB2)

#define        REG_READ                                        (0x7F)
#define        REG_WRITE                                (0x80)

SPI初始化:
void Si4432_init(void)
{
    SDN_CLR;                                                //开RF模块
        Delay_ms(1000);
    SpiWriteAddressData( OperatingFunctionControl1 , 0x80);//软复位
        Delay_ms(1);        //timeout for SW POR interrupt(~1ms)

        SpiWriteAddressData( InterruptEnable1 , 0x00);          //禁止所有中断
    SpiWriteAddressData( InterruptEnable2 , 0x00);
        //SpiWriteAddressData( CrystalOscillatorLoadCapacitance , 0x7F);                 //Add by T.L.Steve
        SpiWriteAddressData( TXRampControl , 0x7F);                 //Add by T.L.Steve
        SpiWriteAddressData( AFCLoopGearshiftOverride , 0x00);
        SpiWriteAddressData( FrequencyBandSelect , 0x53);      //set frequency
        SpiWriteAddressData( NominalCarrierFrequency1 , 0x4b);//433HZ
        SpiWriteAddressData( NominalCarrierFrequency0 , 0x00);
        SpiWriteAddressData( ModulationModeControl1 , 0x00);
        SpiWriteAddressData( ModulationModeControl2 , 0x22);      //asynchronous modeFSK
        SpiWriteAddressData( HeaderControl2 , 0x02);             //no head; sync word 3 and 2
        SpiWriteAddressData( HeaderControl1 , 0x00);
        SpiWriteAddressData( PreambleLength , 0x04);            // 2 byte
        SpiWriteAddressData( PreambleDetectionControl , 0x10);   //8bit
        SpiWriteAddressData( SyncWord3 , 0x2d);
        SpiWriteAddressData( SyncWord2 , 0xa4);
        SpiWriteAddressData( DataAccessControl , 0x88); //enable TX handling
        SpiWriteAddressData( IFFilterBandwidth , 0x03); //BW=90kHZ
        SpiWriteAddressData( ClockRecoveryOversamplingRatio , 0xa1);
        SpiWriteAddressData( ClockRecoveryOffset2 , 0x20);
        SpiWriteAddressData( ClockRecoveryOffset1 , 0x4e);
        SpiWriteAddressData( ClockRecoveryOffset0 , 0xa5);
        SpiWriteAddressData( ClockRecoveryTimingLoopGain1 , 0x00);
        SpiWriteAddressData( ClockRecoveryTimingLoopGain0 , 0x36);
      
        SpiWriteAddressData( TXDataRate1 , 0x02); //9600BPS
        SpiWriteAddressData( TXDataRate0 , 0x75);
      
        SpiWriteAddressData( FrequencyDeviation , 0x48);
        SpiWriteAddressData( ClockRecoveryGearshiftOverride , 0x13);
        SpiWriteAddressData( GPIO0Configuration , 0x1f);
        SpiWriteAddressData( GPIO1Configuration , 0x12); //GPIO_1 TX state
        SpiWriteAddressData( GPIO2Configuration , 0x15); //GPIO_2 RX state
        SpiWriteAddressData( OperatingFunctionControl2 , 0x03);//清接收、发射FIFO
        SpiWriteAddressData( OperatingFunctionControl2 , 0x00);//恢复接收、发射FIFO正常
        SpiWriteAddressData( OperatingFunctionControl1 , 0x05);//进入“接收模式”和“预备模式”
        Delay_ms(1000);   
}

硬件连接:


MiniCat 发表于 2012-4-5 11:04:57

我读任意一个地址的内容,返回来的刚开始是0,几次后就都是乱码,而且乱码会循环。求解!

MiniCat 发表于 2012-4-5 13:21:18

是我SPI设置有问题吗,还是程序问题?大侠们帮忙看看呀

MiniCat 发表于 2012-4-5 20:53:12

麻烦各位大侠帮我瞧瞧啊,现在最基本的东西我都没搞通呢,别的就更进行不下去了。

MiniCat 发表于 2012-4-5 21:42:39

SPI我设置的是SPI使能、主模式、数据LSB First 、128分频,模式0,这几个设置里面有错的吗?用过的请帮个忙瞧一下,谢谢。

MiniCat 发表于 2012-4-5 21:44:40

本帖最后由 MiniCat 于 2012-4-5 21:46 编辑

补充一下,我用得外部晶振7.3728MHz。SPI时钟频率57599Hz。mege8用得3.3V供电,直接和SI4432的SPI接口相连

MiniCat 发表于 2012-4-5 22:17:05

{:cry:}{:cry:}{:cry:}{:cry:}{:cry:}{:cry:}
人都去哪了呀?我什么方法都试了,还是那个样子、、、痛苦挣扎中!

MiniCat 发表于 2012-4-5 23:03:37

搞明白了、、、MSB First 这里设置错啦{:sweat:}
{:lol:}{:lol:}{:lol:}

MiniCat 发表于 2012-4-5 23:06:45

总结:这个小问题折磨了自己一天,有问题,还是先自己研究研究,多看数据手册,要重点位置仔细的看,一个细节都不能放过。

MiniCat 发表于 2012-4-5 23:08:51

再附上一个问题,与SI4432的SPI时钟频率设置多少比较好,手册上写最大10MHz,我刚才测试发现我的板子在1M内工作正常,1.8M和3.6M数据都会有错误,这个经验值是多少呢?

MiniCat 发表于 2012-4-6 09:05:42


再把这个图片贴出来,免得有人跟我一样笨,把手册看错了。
这张图我看第一眼的时候,认为时钟是上升沿采样,下降沿设置,set发送前拉低,完毕后置高,数据data因为LSB在右侧,MSB在左侧,所以想当然的认为LSB先发,可是、、、、收发却是错误的,他上面标注的ADD 和Data,应该是ADD先,DATA后,所以也就是MSB先发,LSB后发,与时钟线反着看,就这样的问题困扰了我一整天,汗、、、、以后仔细看看数据手册很重要,希望给大家提个醒,引以为戒!

admiralsoft 发表于 2012-7-4 20:44:15

楼主,可以把你的完整代码共享一下不?!

happydk666 发表于 2012-9-16 13:09:29

MiniCat 发表于 2012-4-6 09:05 static/image/common/back.gif
再把这个图片贴出来,免得有人跟我一样笨,把手册看错了。
这张图我看第一眼的时候,认为时钟是上升沿采样 ...

你好,有点si4432的问题,想和你学习一下.我用gpio模拟spi,怎么也无法与4432通信上.我的qq是406232227.多谢.我的阿莫账号新注册的.站内无法加你为好友

MiniCat 发表于 2012-9-26 12:21:16

happydk666 发表于 2012-9-16 13:09 static/image/common/back.gif
你好,有点si4432的问题,想和你学习一下.我用gpio模拟spi,怎么也无法与4432通信上.我的qq是406232227.多谢 ...

/*****************************************
功能描述:SPI指定地址写1字节数据
参    数:uchar add   目标地址
                  uchar data        数据
返 回 值:无
*****************************************/
void SpiWriteAddressData(uchar add, uchar data)
{
    unsigned char i;
    nSET_CLR;
    add = add | 0x80;          //写操作
    for(i=0;i<8;i++)         //先写地址
    {
      if((add&0x80)==0x80)
            SDI_SET; //DIN=1
      else
            SDI_CLR; //DIN=0
      DelayUs(1);
      SCLK_SET;    //CLK=1
      DelayUs(2);
      SCLK_CLR;    //CLK=0
      add = add << 1;
      DelayUs(1);
    }
    for(i=0;i<8;i++)         //再写数据
    {
      if((data&0x80)==0x80)
            SDI_SET; //DIN=1
      else
            SDI_CLR; //DIN=0
      DelayUs(1);
      SCLK_SET;    //CLK=1
      DelayUs(2);
      SCLK_CLR;    //CLK=0
      data = data << 1;
      DelayUs(1);
    }
    nSET_SET;
}
/*****************************************
功能描述:SPI指定地址读1字节数据
参    数:uchar add   目标地址
返 回 值:指定地址数据
*****************************************/
uchar SpiReadAddressData(uchar add)
{
    unsigned char i,data;
    nSET_CLR;
    add = add & 0x7f;          //读操作
    for(i=0;i<8;i++)         //先写地址
    {
      if((add&0x80)==0x80)
            SDI_SET; //DIN=1
      else
            SDI_CLR; //DIN=0
      DelayUs(1);
      SCLK_SET;    //CLK=1
      DelayUs(2);
      SCLK_CLR;    //CLK=0
      add = add << 1;
      DelayUs(1);
    }
    data = 0;
    for(i=0;i<8;i++)         //再写数据
    {
      DelayUs(1);
      data = data << 1;
      SCLK_SET; //CLK=1
      DelayUs(2);
      if(SDO_H)
            data++;
      DelayUs(1);
      SCLK_CLR; //CLK=0
      DelayUs(1);
    }
    nSET_SET;
    return (data);
}

admiralsoft 发表于 2012-10-8 13:15:53

MiniCat 发表于 2012-4-5 11:04 static/image/common/back.gif
我读任意一个地址的内容,返回来的刚开始是0,几次后就都是乱码,而且乱码会循环。求解! ...

您好,我现在用看到你有关SI4432的帖子,想要一份您的代码谢谢。
LoveDowns@163.com

lalapunk1983 发表于 2012-10-10 16:19:32

HOPE RF模块的代码就是SI44XX的,代码他们网站有。

hmilyxfcy 发表于 2013-6-2 16:52:41

楼主有个问题想请教下,我用的平台和你差不多,是avr的meg128,其中,我对spi设置比较困惑。看你的设置是“时钟是上升沿采样,下降沿设置,”即“CPOL = 0, CPHA = 0”。而这个帖子 分享调试SI4432的一些小经验,里的设置却是“SPI的时钟的第2个跳变沿数据被采样。(SPI_CPHA)”,你们都不一样的啊,小弟比较困惑。现在SPI还没通,因为读 Si4432的00,01,02寄存器,返回值全是00。希望楼主赐教

fanice 发表于 2013-6-3 17:39:22

/********************************************************
SPI初始化
********************************************************/
void Spi_init(void)
{
        SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);   // 主机模式,fck/16, SPI方式0
}
哥们,用你一楼的程序加这个SPI的初始化很好用。

fanice 发表于 2013-6-3 17:54:59

刚才也发现了和你一样的现象,不断的出现乱码,总结了下,可能是由于使用usb-com的原因,不是一个电源系统,当使用同一个电源系统时,不在出现乱码现象。

ST_ATMEL_NXP 发表于 2014-8-2 23:18:54

hmilyxfcy 发表于 2013-6-2 16:52
楼主有个问题想请教下,我用的平台和你差不多,是avr的meg128,其中,我对spi设置比较困惑。看你的设置是“ ...

spi的四种模式都试遍了,读取02寄存器的ID都是0,不知道你的问题解决了没有。我的波特率是1M500K都试过。都不行。

strongking 发表于 2014-8-6 12:46:07

顶一下楼主,在看{:lol:}

一年潜水员 发表于 2015-4-26 00:47:59

这个真的是不错啊

王海峰 发表于 2015-10-29 16:51:34

{:handshake:}

rundream 发表于 2015-10-31 20:43:43

试了1下,4M Hz晶振。500kSPI不行。不知道原因在哪里。

MiniCat 发表于 2015-11-3 17:15:08

rundream 发表于 2015-10-31 20:43
试了1下,4M Hz晶振。500kSPI不行。不知道原因在哪里。

示波器抓抓波形,分析下时序看看。4432的SPI最高可达10MHz,但是跟你的PCB布线有关系,布线不佳,跑2MHz都过不去。
页: [1]
查看完整版本: [求助]AVR MEGA8 与SI4432 SPI通信问题