Changer119 发表于 2010-10-15 22:42:34

通过SPI读写CC2500的寄存器错误

大家好! 我通过msp430f2274的USCIB0的spi接口去控制CC2500,但是通过msp430给cc2500的寄存器写入一个值,然后再读取该寄存器,结果得到的值(总是0x0F)跟之前写入的不一样,请问有哪些原因可以导致这种情况??我用万用表点过,貌似SPI口都是连接正确的,程序也不会有多大问题。我的CC2500的外围电路就是按照datasheet中的推荐电路设计的,不过焊接时只焊接了图中用红圈圈住的期间。 5.6K的电阻被1K替换后,会造成这种影响吗?
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590194LV2QRQ.jpg
CC2500外围电路 (原文件名:2010-10-15_224049.jpg)

kawajima 发表于 2010-10-16 09:51:15

网上有源代码,请耐心寻找,也可联系我,13641248742短信,chuandaoxy@126.com

Changer119 发表于 2010-10-16 11:09:15

我也贴一下代码:

void main()
{
WDTCTL = WDTHOLD + WDTPW;

// 初始化SPI接口
SPISetup();
_NOP();

PowerupResetCCxxxx();

// 测试SPI
SPIWriteReg(TI_CCxxx0_IOCFG0, 0x09);
testValue = SPIReadReg(TI_CCxxx0_IOCFG0);

_NOP();
_NOP();

}

void SPISetup(void)
{
TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;


UCB0CTL0 |= UCMST+UCCKPL+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
UCB0CTL1 |= UCSSEL_2;                     // SMCLK
UCB0BR0 |= 0x02;                        // UCLK/2
UCB0BR1 = 0;
//UCB0MCTL = 0;
TI_CC_SPI_USCIB0_PxSEL |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_SOMI | TI_CC_SPI_USCIB0_UCLK;
                                          // SPI option select
TI_CC_SPI_USCIB0_PxDIR |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_UCLK;
                                          // SPI TXD out direction
UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
}



// Delay function. # of CPU cycles delayed is similar to "cycles". Specifically,
// it's ((cycles-15) % 6) + 15.Not exact, but gives a sense of the real-time
// delay.Also, if MCLK ~1MHz, "cycles" is similar to # of useconds delayed.
void Wait(unsigned int cycles)
{
while(cycles>15)                        // 15 cycles consumed by overhead
    cycles = cycles - 6;                  // 6 cycles consumed each iteration
}



void SPIWriteReg(char addr, char value)
{
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);   // Wait for CCxxxx ready
IFG2 &= ~UCB0RXIFG;                     // Clear flag
UCB0TXBUF = (addr | TI_CCxxx0_READ_SINGLE);   // Send address ( addr | 0x80)
while (!(IFG2&UCB0RXIFG));            // Wait for TX to finish
IFG2 &= ~UCB0RXIFG;                     // Clear flag
UCB0TXBUF = value;                      // Send data
while (!(IFG2&UCB0RXIFG));            // Wait for TX to finish
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
}


char SPIReadReg(char addr)
{
char tmp;

TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;          // Enable CSn
while (!(IFG2&UCB0TXIFG));                // Wait for TX to finish
UCB0TXBUF = addr;                         // Send address
while (!(IFG2&UCB0TXIFG));                // Wait for TX to finish
UCB0TXBUF = 0;                            // Dummy write so we can read data
// Address is now being TX'ed, with dummy byte waiting in TXBUF...
while (!(IFG2&UCB0RXIFG));                // Wait for RX to finish
// Dummy byte RX'ed during addr TX now in RXBUF
IFG2 &= ~UCB0RXIFG;                     // Clear flag set during addr write
while (!(IFG2&UCB0RXIFG));                // Wait for end of dummy byte TX
// Data byte RX'ed during dummy byte write is now in RXBUF
tmp = UCB0RXBUF;                        // Read data
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable

return tmp;
}


void PowerupResetCCxxxx(void)
{
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
Wait(30);
TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
Wait(30);
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
Wait(45);

TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);   // Wait for CCxxxx ready
UCB0TXBUF = TI_CCxxx0_SRES;               // Send strobe(RST)
// Strobe addr is now being TX'ed
IFG2 &= ~UCB0RXIFG;                     // Clear flag
while (!(IFG2&UCB0RXIFG));                // Wait for end of addr TX
while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);
TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
}


头文件关于SPI的定义如下:
// use the USCI_B0   SPI@MSP430F2274


#define TI_CC_SPI_USCIB0_PxSELP3SEL    // MSP430F2274
#define TI_CC_SPI_USCIB0_PxDIRP3DIR
#define TI_CC_SPI_USCIB0_PxIN   P3IN

#define TI_CC_SPI_USCIB0_SIMO   BIT1
#define TI_CC_SPI_USCIB0_SOMI   BIT2
#define TI_CC_SPI_USCIB0_UCLK   BIT3


#define TI_CC_CSn_PxOUT         P3OUT
#define TI_CC_CSn_PxDIR         P3DIR
#define TI_CC_CSn_PIN         BIT0          //P3.0 --> CSn   @msp430f2274
页: [1]
查看完整版本: 通过SPI读写CC2500的寄存器错误