搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

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

CC2500外围电路 (原文件名:2010-10-15_224049.jpg)

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

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

出0入0汤圆

发表于 2010-10-16 09:51:15 | 显示全部楼层
网上有源代码,请耐心寻找,也可联系我,13641248742短信,chuandaoxy@126.com

出0入0汤圆

 楼主| 发表于 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_PxSEL  P3SEL    // MSP430F2274
#define TI_CC_SPI_USCIB0_PxDIR  P3DIR
#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
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-28 15:20

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

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