[求助]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);
}
硬件连接:
我读任意一个地址的内容,返回来的刚开始是0,几次后就都是乱码,而且乱码会循环。求解! 是我SPI设置有问题吗,还是程序问题?大侠们帮忙看看呀 麻烦各位大侠帮我瞧瞧啊,现在最基本的东西我都没搞通呢,别的就更进行不下去了。 SPI我设置的是SPI使能、主模式、数据LSB First 、128分频,模式0,这几个设置里面有错的吗?用过的请帮个忙瞧一下,谢谢。 本帖最后由 MiniCat 于 2012-4-5 21:46 编辑
补充一下,我用得外部晶振7.3728MHz。SPI时钟频率57599Hz。mege8用得3.3V供电,直接和SI4432的SPI接口相连 {:cry:}{:cry:}{:cry:}{:cry:}{:cry:}{:cry:}
人都去哪了呀?我什么方法都试了,还是那个样子、、、痛苦挣扎中! 搞明白了、、、MSB First 这里设置错啦{:sweat:}
{:lol:}{:lol:}{:lol:} 总结:这个小问题折磨了自己一天,有问题,还是先自己研究研究,多看数据手册,要重点位置仔细的看,一个细节都不能放过。 再附上一个问题,与SI4432的SPI时钟频率设置多少比较好,手册上写最大10MHz,我刚才测试发现我的板子在1M内工作正常,1.8M和3.6M数据都会有错误,这个经验值是多少呢?
再把这个图片贴出来,免得有人跟我一样笨,把手册看错了。
这张图我看第一眼的时候,认为时钟是上升沿采样,下降沿设置,set发送前拉低,完毕后置高,数据data因为LSB在右侧,MSB在左侧,所以想当然的认为LSB先发,可是、、、、收发却是错误的,他上面标注的ADD 和Data,应该是ADD先,DATA后,所以也就是MSB先发,LSB后发,与时钟线反着看,就这样的问题困扰了我一整天,汗、、、、以后仔细看看数据手册很重要,希望给大家提个醒,引以为戒! 楼主,可以把你的完整代码共享一下不?! MiniCat 发表于 2012-4-6 09:05 static/image/common/back.gif
再把这个图片贴出来,免得有人跟我一样笨,把手册看错了。
这张图我看第一眼的时候,认为时钟是上升沿采样 ...
你好,有点si4432的问题,想和你学习一下.我用gpio模拟spi,怎么也无法与4432通信上.我的qq是406232227.多谢.我的阿莫账号新注册的.站内无法加你为好友 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);
} MiniCat 发表于 2012-4-5 11:04 static/image/common/back.gif
我读任意一个地址的内容,返回来的刚开始是0,几次后就都是乱码,而且乱码会循环。求解! ...
您好,我现在用看到你有关SI4432的帖子,想要一份您的代码谢谢。
LoveDowns@163.com HOPE RF模块的代码就是SI44XX的,代码他们网站有。 楼主有个问题想请教下,我用的平台和你差不多,是avr的meg128,其中,我对spi设置比较困惑。看你的设置是“时钟是上升沿采样,下降沿设置,”即“CPOL = 0, CPHA = 0”。而这个帖子 分享调试SI4432的一些小经验,里的设置却是“SPI的时钟的第2个跳变沿数据被采样。(SPI_CPHA)”,你们都不一样的啊,小弟比较困惑。现在SPI还没通,因为读 Si4432的00,01,02寄存器,返回值全是00。希望楼主赐教 /********************************************************
SPI初始化
********************************************************/
void Spi_init(void)
{
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); // 主机模式,fck/16, SPI方式0
}
哥们,用你一楼的程序加这个SPI的初始化很好用。 刚才也发现了和你一样的现象,不断的出现乱码,总结了下,可能是由于使用usb-com的原因,不是一个电源系统,当使用同一个电源系统时,不在出现乱码现象。 hmilyxfcy 发表于 2013-6-2 16:52
楼主有个问题想请教下,我用的平台和你差不多,是avr的meg128,其中,我对spi设置比较困惑。看你的设置是“ ...
spi的四种模式都试遍了,读取02寄存器的ID都是0,不知道你的问题解决了没有。我的波特率是1M500K都试过。都不行。 顶一下楼主,在看{:lol:} 这个真的是不错啊 {:handshake:} 试了1下,4M Hz晶振。500kSPI不行。不知道原因在哪里。 rundream 发表于 2015-10-31 20:43
试了1下,4M Hz晶振。500kSPI不行。不知道原因在哪里。
示波器抓抓波形,分析下时序看看。4432的SPI最高可达10MHz,但是跟你的PCB布线有关系,布线不佳,跑2MHz都过不去。
页:
[1]