搜索
bottom↓
回复: 24

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

[复制链接]

出0入0汤圆

发表于 2012-4-5 10:58:09 | 显示全部楼层 |阅读模式
本帖最后由 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 mode  FSK
        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);   
}

硬件连接:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-4-5 11:04:57 | 显示全部楼层
我读任意一个地址的内容,返回来的刚开始是0,几次后就都是乱码,而且乱码会循环。求解!

出0入0汤圆

 楼主| 发表于 2012-4-5 13:21:18 | 显示全部楼层
是我SPI设置有问题吗,还是程序问题?大侠们帮忙看看呀

出0入0汤圆

 楼主| 发表于 2012-4-5 20:53:12 | 显示全部楼层
麻烦各位大侠帮我瞧瞧啊,现在最基本的东西我都没搞通呢,别的就更进行不下去了。

出0入0汤圆

 楼主| 发表于 2012-4-5 21:42:39 | 显示全部楼层
SPI我设置的是SPI使能、主模式、数据LSB First 、128分频,模式0,这几个设置里面有错的吗?用过的请帮个忙瞧一下,谢谢。

出0入0汤圆

 楼主| 发表于 2012-4-5 21:44:40 | 显示全部楼层
本帖最后由 MiniCat 于 2012-4-5 21:46 编辑

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

出0入0汤圆

 楼主| 发表于 2012-4-5 22:17:05 | 显示全部楼层

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

出0入0汤圆

 楼主| 发表于 2012-4-5 23:03:37 | 显示全部楼层
搞明白了、、、MSB First 这里设置错啦

出0入0汤圆

 楼主| 发表于 2012-4-5 23:06:45 | 显示全部楼层
总结:这个小问题折磨了自己一天,有问题,还是先自己研究研究,多看数据手册,要重点位置仔细的看,一个细节都不能放过。

出0入0汤圆

 楼主| 发表于 2012-4-5 23:08:51 | 显示全部楼层
再附上一个问题,与SI4432的SPI时钟频率设置多少比较好,手册上写最大10MHz,我刚才测试发现我的板子在1M内工作正常,1.8M和3.6M数据都会有错误,这个经验值是多少呢?

出0入0汤圆

 楼主| 发表于 2012-4-6 09:05:42 | 显示全部楼层

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-4 20:44:15 | 显示全部楼层
楼主,可以把你的完整代码共享一下不?!

出0入0汤圆

发表于 2012-9-16 13:09:29 | 显示全部楼层
MiniCat 发表于 2012-4-6 09:05
再把这个图片贴出来,免得有人跟我一样笨,把手册看错了。
这张图我看第一眼的时候,认为时钟是上升沿采样 ...

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

出0入0汤圆

 楼主| 发表于 2012-9-26 12:21:16 | 显示全部楼层
happydk666 发表于 2012-9-16 13:09
你好,有点si4432的问题,想和你学习一下.我用gpio模拟spi,怎么也无法与4432通信上.我的qq是406232227.多谢 ...
  1. /*****************************************
  2. 功能描述:SPI指定地址写1字节数据
  3. 参    数:uchar add     目标地址
  4.                   uchar data        数据
  5. 返 回 值:无
  6. *****************************************/
  7. void SpiWriteAddressData(uchar add, uchar data)
  8. {
  9.     unsigned char i;
  10.     nSET_CLR;
  11.     add = add | 0x80;          //写操作
  12.     for(i=0;i<8;i++)           //先写地址
  13.     {
  14.         if((add&0x80)==0x80)
  15.             SDI_SET; //DIN=1
  16.         else
  17.             SDI_CLR; //DIN=0
  18.         DelayUs(1);
  19.         SCLK_SET;    //CLK=1
  20.         DelayUs(2);
  21.         SCLK_CLR;    //CLK=0
  22.         add = add << 1;
  23.         DelayUs(1);  
  24.     }
  25.     for(i=0;i<8;i++)           //再写数据
  26.     {
  27.         if((data&0x80)==0x80)
  28.             SDI_SET; //DIN=1
  29.         else
  30.             SDI_CLR; //DIN=0
  31.         DelayUs(1);
  32.         SCLK_SET;    //CLK=1
  33.         DelayUs(2);
  34.         SCLK_CLR;    //CLK=0
  35.         data = data << 1;
  36.         DelayUs(1);  
  37.     }
  38.     nSET_SET;
  39. }
  40. /*****************************************
  41. 功能描述:SPI指定地址读1字节数据
  42. 参    数:uchar add     目标地址
  43. 返 回 值:指定地址数据
  44. *****************************************/
  45. uchar SpiReadAddressData(uchar add)
  46. {
  47.     unsigned char i,data;
  48.     nSET_CLR;
  49.     add = add & 0x7f;          //读操作
  50.     for(i=0;i<8;i++)           //先写地址
  51.     {
  52.         if((add&0x80)==0x80)
  53.             SDI_SET; //DIN=1
  54.         else
  55.             SDI_CLR; //DIN=0
  56.         DelayUs(1);
  57.         SCLK_SET;    //CLK=1
  58.         DelayUs(2);
  59.         SCLK_CLR;    //CLK=0
  60.         add = add << 1;
  61.         DelayUs(1);  
  62.     }
  63.     data = 0;
  64.     for(i=0;i<8;i++)           //再写数据
  65.     {
  66.         DelayUs(1);
  67.         data = data << 1;
  68.         SCLK_SET; //CLK=1
  69.         DelayUs(2);
  70.         if(SDO_H)
  71.             data++;
  72.         DelayUs(1);
  73.         SCLK_CLR; //CLK=0
  74.         DelayUs(1);
  75.     }  
  76.     nSET_SET;
  77.     return (data);
  78. }
复制代码

出0入0汤圆

发表于 2012-10-8 13:15:53 | 显示全部楼层
MiniCat 发表于 2012-4-5 11:04
我读任意一个地址的内容,返回来的刚开始是0,几次后就都是乱码,而且乱码会循环。求解! ...

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

出0入0汤圆

发表于 2012-10-10 16:19:32 | 显示全部楼层
HOPE RF模块的代码就是SI44XX的,代码他们网站有。

出0入0汤圆

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

出0入0汤圆

发表于 2013-6-3 17:39:22 | 显示全部楼层
/********************************************************
SPI初始化
********************************************************/
void Spi_init(void)
{
        SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);   // 主机模式,fck/16, SPI方式0
}
哥们,用你一楼的程序加这个SPI的初始化很好用。

出0入0汤圆

发表于 2013-6-3 17:54:59 | 显示全部楼层
刚才也发现了和你一样的现象,不断的出现乱码,总结了下,可能是由于使用usb-com的原因,不是一个电源系统,当使用同一个电源系统时,不在出现乱码现象。

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-8-6 12:46:07 | 显示全部楼层
顶一下楼主,在看

出0入0汤圆

发表于 2015-4-26 00:47:59 | 显示全部楼层
这个真的是不错啊

出0入0汤圆

发表于 2015-10-29 16:51:34 | 显示全部楼层

出0入0汤圆

发表于 2015-10-31 20:43:43 来自手机 | 显示全部楼层
试了1下,4M Hz晶振。500kSPI不行。不知道原因在哪里。

出0入0汤圆

 楼主| 发表于 2015-11-3 17:15:08 | 显示全部楼层
rundream 发表于 2015-10-31 20:43
试了1下,4M Hz晶振。500kSPI不行。不知道原因在哪里。

示波器抓抓波形,分析下时序看看。4432的SPI最高可达10MHz,但是跟你的PCB布线有关系,布线不佳,跑2MHz都过不去。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 08:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表