打印
[技术求助]

一直输出方波

[复制链接]
716|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2020-9-8 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhaoxqi| | 2020-9-8 21:52 | 只看该作者
不是程序同时执行,而是cpu在执行main函数的同时,定时器同时也在计数。当计数溢出之后,main函数就不再执行转而执行中段函数去了。中段函数执行完之后再返回执行main。就是这么个过程。多写写程序体会就深了。

使用特权

评论回复
板凳
wyjie|  楼主 | 2020-9-8 21:56 | 只看该作者
该模块只需要发送,用的单片机为AT90S2313。程序如下:
#define CS_ON PORTD&=~(1<PD3)
#define CS_OFF PORTD|=(1<PD3)
#define SCK_ON PORTD|=(1<PD4)
#define SCK_OFF PORTD&=~(1<PD4)
#define MOSI_ON PORTD|=(1<PD5)
#define MOSI_OFF PORTD&=~(1<PD5)

typedef struct S_RF_SETTINGS
{
INT8U FSCTRL2; //
INT8U FSCTRL1; // Frequency synthesizer control.
INT8U FSCTRL0; // Frequency synthesizer control.
INT8U FREQ2; // Frequency control word, high INT8U.
INT8U FREQ1; // Frequency control word, middle INT8U.
INT8U FREQ0; // Frequency control word, low INT8U.
INT8U MDMCFG4; // Modem configuration.
INT8U MDMCFG3; // Modem configuration.
INT8U MDMCFG2; // Modem configuration.
INT8U MDMCFG1; // Modem configuration.
INT8U MDMCFG0; // Modem configuration.
INT8U CHANNR; // Channel number.
INT8U DEVIATN; // Modem deviation setting (when FSK modulation is enabled).
INT8U FREND1; // Front end RX configuration.
INT8U FREND0; // Front end RX configuration.
INT8U MCSM0; // Main Radio Control State Machine configuration.
INT8U FOCCFG; // Frequency Offset Compensation Configuration.
INT8U BSCFG; // Bit synchronization Configuration.
INT8U AGCCTRL2; // AGC control.
INT8U AGCCTRL1; // AGC control.
INT8U AGCCTRL0; // AGC control.
INT8U FSCAL3; // Frequency synthesizer calibration.
INT8U FSCAL2; // Frequency synthesizer calibration.
INT8U FSCAL1; // Frequency synthesizer calibration.
INT8U FSCAL0; // Frequency synthesizer calibration.
INT8U FSTEST; // Frequency synthesizer calibration control
INT8U TEST2; // Various test settings.
INT8U TEST1; // Various test settings.
INT8U TEST0; // Various test settings.
INT8U IOCFG2; // GDO2 output pin configuration
INT8U IOCFG0; // GDO0 output pin configuration
INT8U PKTCTRL1; // Packet automation control.
INT8U PKTCTRL0; // Packet automation control.
INT8U ADDR; // Device address.
INT8U PKTLEN; // Packet length.
} RF_SETTINGS;




void OpenSpi()
{
SCK_OFF;
MOSI_OFF;
CS_ON;
while (PIND&(1<<6));
}

void CloseSpi()
{
CS_OFF;
}

void SPI_WriteByte(unsigned char Data)
{

unsigned char i;
for (i=0; i<8; i++)
{
if (Data&0x80)
MOSI_ON;
else
MOSI_OFF;
_NOP();
_NOP();
_NOP();

SCK_ON;
_NOP();
_NOP();
_NOP();
_NOP();
SCK_OFF;

Data<<=1;
}
}




unsigned char SPI_ReadByte()
{

unsigned char i;
unsigned char Data;
for (i=0; i<8; i++)
{

Data<<=1;
_NOP();
_NOP();
SCK_ON;
if (PIND&(1<<6))
Data |= 0x01;
else
Data &= 0xfe;
_NOP();
_NOP();
_NOP();
_NOP();
SCK_OFF;
_NOP();
_NOP();
}
return Data;
}





void halWait(INT16U timeout) {
do {
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
} while (--timeout);
}// halWait


void RESET_CC2500(void)
{
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(CCxxx0_SRES);
CloseSpi();
}




void POWER_UP_RESET_CCxxx0(void)
{
CloseSpi();
halWait(1);
OpenSpi();
halWait(1);
CloseSpi();
halWait(41);
RESET_CC2500();
}





//<主机通过SPI接口向CC2500配置寄存器读写入信息>
INT8U halSpiReadReg(INT8U addr)
{
INT8U temp, value;
temp = addr|READ_SINGLE; //读寄存器命令
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(temp);
value = SPI_ReadByte(0);
CloseSpi();
return value;
}




void halSpiWriteReg(INT8U addr, INT8U value)
{
OpenSpi();
while(PIND&(1<<6));
SPI_WriteByte(addr); //写地址
SPI_WriteByte(value); //写入配置
CloseSpi();
}




void halSpiStrobe(BYTE strobe)
{
INT8U temp;
temp = strobe;
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(temp);
CloseSpi();
}




void halSpiWriteBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
INT8U i,temp;
temp = addr | WRITE_BURST;
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(temp);
for (i = 0; i < count; i++)
{
SPI_WriteByte(buffer);
}
CloseSpi();
}




// 配置RF2500
void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
{
halSpiWriteReg(CCxxx0_FSCTRL0, pRfSettings->FSCTRL2); // Write register settings
halSpiWriteReg(CCxxx0_FSCTRL1, pRfSettings->FSCTRL1);
halSpiWriteReg(CCxxx0_FSCTRL0, pRfSettings->FSCTRL0);
halSpiWriteReg(CCxxx0_FREQ2, pRfSettings->FREQ2);
halSpiWriteReg(CCxxx0_FREQ1, pRfSettings->FREQ1);
halSpiWriteReg(CCxxx0_FREQ0, pRfSettings->FREQ0);
halSpiWriteReg(CCxxx0_MDMCFG4, pRfSettings->MDMCFG4);
halSpiWriteReg(CCxxx0_MDMCFG3, pRfSettings->MDMCFG3);
halSpiWriteReg(CCxxx0_MDMCFG2, pRfSettings->MDMCFG2);
halSpiWriteReg(CCxxx0_MDMCFG1, pRfSettings->MDMCFG1);
halSpiWriteReg(CCxxx0_MDMCFG0, pRfSettings->MDMCFG0);
halSpiWriteReg(CCxxx0_CHANNR, pRfSettings->CHANNR);
halSpiWriteReg(CCxxx0_DEVIATN, pRfSettings->DEVIATN);
halSpiWriteReg(CCxxx0_FREND1, pRfSettings->FREND1);
halSpiWriteReg(CCxxx0_FREND0, pRfSettings->FREND0);
halSpiWriteReg(CCxxx0_MCSM0 , pRfSettings->MCSM0 );
halSpiWriteReg(CCxxx0_FOCCFG, pRfSettings->FOCCFG);
halSpiWriteReg(CCxxx0_BSCFG, pRfSettings->BSCFG);
halSpiWriteReg(CCxxx0_AGCCTRL2, pRfSettings->AGCCTRL2);
halSpiWriteReg(CCxxx0_AGCCTRL1, pRfSettings->AGCCTRL1);
halSpiWriteReg(CCxxx0_AGCCTRL0, pRfSettings->AGCCTRL0);
halSpiWriteReg(CCxxx0_FSCAL3, pRfSettings->FSCAL3);
halSpiWriteReg(CCxxx0_FSCAL2, pRfSettings->FSCAL2);
halSpiWriteReg(CCxxx0_FSCAL1, pRfSettings->FSCAL1);
halSpiWriteReg(CCxxx0_FSCAL0, pRfSettings->FSCAL0);
halSpiWriteReg(CCxxx0_FSTEST, pRfSettings->FSTEST);
halSpiWriteReg(CCxxx0_TEST2, pRfSettings->TEST2);
halSpiWriteReg(CCxxx0_TEST1, pRfSettings->TEST1);
halSpiWriteReg(CCxxx0_TEST0, pRfSettings->TEST0);
halSpiWriteReg(CCxxx0_IOCFG2, pRfSettings->IOCFG2);
halSpiWriteReg(CCxxx0_IOCFG0, pRfSettings->IOCFG0);
halSpiWriteReg(CCxxx0_PKTCTRL1, pRfSettings->PKTCTRL1);
halSpiWriteReg(CCxxx0_PKTCTRL0, pRfSettings->PKTCTRL0);
halSpiWriteReg(CCxxx0_ADDR, pRfSettings->ADDR);
halSpiWriteReg(CCxxx0_PKTLEN, pRfSettings->PKTLEN);
}



//其中,rfSettings需要定义并按照需要初始化适当的值。比如配置如下:
// RF output power = 0 dBm
// RX filterbandwidth = 540.000000 kHz
// Deviation = 0.000000
// Datarate = 250.000000 kbps
// Modulation = (7) MSK
// Manchester enable = (0) Manchester disabled
// RF Frequency = 2480.000000 MHz
// Channel spacing = 199.951172 kHz
// Channel number = 0
// Optimization = Sensitivity
// Sync mode = (3) 30/32 sync word bits detected
// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX
// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled
// Forward Error Correction = (0) FEC disabled
// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.
// Packetlength = 255
// Preamble count = (2) 4 bytes
// Append status = 1
// Address check = (11) No address check
// FIFO autoflush = 0
// Device address = 0
// GDO0 signal selection = ( 6)
// GDO2 signal selection = (11) Serial Clock


const RF_SETTINGS rfSettings = {
0x00,
0x0B, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x10, // FREQ2 Frequency control word, high byte.
0xA7, // FREQ1 Frequency control word, middle byte.
0x62, // FREQ0 Frequency control word, low byte.
0x2D, // MDMCFG4 Modem configuration.
0x3B, // MDMCFG3 Modem configuration.
0x73, // MDMCFG2 Modem configuration.
0x22, // MDMCFG1 Modem configuration.
0xF8, // MDMCFG0 Modem configuration.
0x00, // CHANNR Channel number.
0x00, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0xB6, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x1D, // FOCCFG Frequency Offset Compensation Configuration.
0x1C, // BSCFG Bit synchronization Configuration.
0xC7, // AGCCTRL2 AGC control.
0x00, // AGCCTRL1 AGC control.
0xB2, // AGCCTRL0 AGC control.
0xEA, // FSCAL3 Frequency synthesizer calibration.
0x0A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x11, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x88, // TEST2 Various test settings.
0x31, // TEST1 Various test settings.
0x0B, // TEST0 Various test settings.
0x0B, // IOCFG2 GDO2 output pin configuration.
0x06, // IOCFG0D GDO0 output pin configuration.
0x04, // PKTCTRL1 Packet automation control.
0x04, // PKTCTRL0 Packet automation control.
0x00, // ADDR Device address.
0x0c // PKTLEN Packet length.
};
BYTE paTable = 0xFE;




//使用CC2500发送数据
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
//写入要发送的数据
halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
// Wait for GDO0 to be set -> sync transmitted
while (!(PIND&(1<<1)));
// Wait for GDO0 to be cleared -> end of packet
while (PIND&(1<<1));
halSpiStrobe(CCxxx0_SFTX);
}

void main(void)
{
Init();
POWER_UP_RESET_CCxxx0();
halRfWriteRfSettings(&rfSettings);
halSpiWriteReg(CCxxx0_PATABLE, paTable);
while(1)
{
keynum=GetKey(0);
if(!keynum)
halRfSendPacket(keynum,1);
}
}


void Init(void) //初始化串行口和波特率发生器
{
PORTB=0xF0;
PORTD=0x08;
DDRB=0x0F;
DDRD=0xBB;
}
主程序就是一个键盘扫描程序,然后将按下的键通过CC2500发送。
上电后,GDO0脚一直输出方波。不知道程序哪儿有问题,请大家帮帮忙!

使用特权

评论回复
地板
zhenykun| | 2020-9-8 22:00 | 只看该作者
GDO管脚有很多复用功能,请看手册!

使用特权

评论回复
5
yszong| | 2020-9-8 22:03 | 只看该作者
就是参照TI和其他一些范例做的

使用特权

评论回复
6
wyjie|  楼主 | 2020-9-8 22:17 | 只看该作者
问技术支持,说GDO0有一直有方波是因为CC2500没有配置好

使用特权

评论回复
7
wyjie|  楼主 | 2020-9-8 22:22 | 只看该作者
仔细检查了程序,和例子的一样

使用特权

评论回复
8
jiajs| | 2020-9-8 22:26 | 只看该作者
不知道你CC1100初始化好了吗?因为CC1100没初始化而上电,有135KHZ得方波得!

使用特权

评论回复
9
wuhany| | 2020-9-8 22:29 | 只看该作者
不知道你得方波时多少HZ?

使用特权

评论回复
10
午夜粪车| | 2020-9-8 22:34 | 只看该作者
确认一下你的SPI口程序.

使用特权

评论回复
11
yszong| | 2020-9-8 22:36 | 只看该作者
CC2500有两个寄存器ARTNUM和VERSION,正确的读取结果为0x80,0x03.

使用特权

评论回复
12
zhaoxqi| | 2020-9-8 22:42 | 只看该作者
可以通过读取这两个寄存器来确定你的CC2500以及SPI是否工作正常.

使用特权

评论回复
13
huangchui| | 2020-9-8 22:45 | 只看该作者

if(!keynum)  halRfSendPacket(keynum,1);
    当keynum=0时才发送!!!!!!!!!!!!!!!!
    所以等效于
    if(keynum==0)  halRfSendPacket(0,1);
    你确定这是你的意思?

使用特权

评论回复
14
jiajs| | 2020-9-8 22:49 | 只看该作者

halRfSendPacket之后要delay不低于2ms.

使用特权

评论回复
15
liliang9554| | 2020-9-8 22:53 | 只看该作者

初始化完成后加个读芯片版本号的程序检验下初始化正常没有.
VER=halSpiReadStatus(CCxxx0_VERSION);

使用特权

评论回复
16
wyjie|  楼主 | 2020-9-8 22:56 | 只看该作者
果然是这儿出错了。。。

使用特权

评论回复
17
午夜粪车| | 2020-9-8 23:00 | 只看该作者
一直输出方波,找你翻转IO的算法部分,应该是变量计算部分的问题。

使用特权

评论回复
18
zhaoxqi| | 2020-9-8 23:05 | 只看该作者
是不是因为由于SPI的时钟引起的呢,时钟就是方波呀

使用特权

评论回复
19
wyjie|  楼主 | 2020-9-8 23:09 | 只看该作者
是不是因为由于SPI的时钟引起的呢,时钟就是方波呀

使用特权

评论回复
20
spark周| | 2020-9-8 23:13 | 只看该作者
还是没有配置好吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

927

主题

12706

帖子

5

粉丝