xiahekun

    1. #include <msp430x14x.h> #define uchar unsigned char #define WRC 0x00            //W_RF_CONFIG #define uint unsigned int #define RRC 0x10            //R_RF_CONFIG #define WTP 0x20            //W_TX_PAYLOAD #define RTP 0x21            //R_TX_PAYLOAD #define WTA 0x22            //W_TX_ADDRESS #define RTA 0x23            //R_TX_ADDRESS #define RRP 0x24            //R_RX_PAYLOAD #define  TXEN_0     P6OUT &=~BIT2          //使能接收模式 #define  TXEN_1     P6OUT |= BIT2          //发射模式 #define  TRX_CE_0   P6OUT &=~BIT1          //禁止TX/RX      #define  TRX_CE_1   P6OUT |= BIT1          //使能TX/RX   #define  PWR_0      P2OUT &=~BIT2          //未上电       #define  PWR_1      P2OUT |= BIT2          //芯片瑕电 #define  MISO_0     P5OUT &=~BIT2          //从NRF905读0      #define  MISO_1     P5OUT |= BIT2          //        读1          #define  MOSI_0     P5OUT &=~BIT1          //MCU写0至NRF905          #define  MOSI_1     P5OUT |= BIT1          //   写1       #define  SCK_0      P5OUT &=~BIT3          //SCK为0          #define  SCK_1      P5OUT |= BIT3          //   为1                  #define  CSN_0      P5OUT &=~BIT0          //使能SPI       #define  CSN_1      P5OUT |= BIT0          //禁止 #define  AM_0       P2OUT &=~BIT6          //AM为0未检测到地址匹配       #define  AM_1       P2OUT |= BIT6          //  为1地址匹配 #define  DR_0       P2OUT &=~BIT7          //DR为0数据未就绪    #define  DR_1       P2OUT |= BIT7          //为1        就绪 #define  CD_0       P2OUT &=~BIT5          //CD为0未收载波 #define  CD_1       P2OUT |= BIT5          //  为1收到载波 uchar RFConfig[10] = {           //配置寄存器的10个配置字节第0至第9字节   0x01,                          //频道设置   0x08,                          //自动重发关,正常模式,输出功率6dB,422.5MHZ   0x44,                          //收发地址长度都为4字节   0x20,                          //接收数据长度,32字节   0x20,                          //发送数据长度,32字节   0x88,   0x88,   0x88,   0x88,                           //4个字节的地址   0x88,                           //使能8位校验,16M晶振,输出外部时钟使能500KHZ }; uchar TxAddress[4]={0x88,0x88,0x88,0x88}; // 4个字节的发送地址 uchar RFRxBuf[32];               //射频接收缓冲区32个字节 uchar RFTxBuf[32];               //射频接收缓冲区32个字节 uchar  DATA_BUF; void NRF905_IO_init(void) {    P6SEL &= ~(BIT2|BIT1|BIT0);   //p6.0, p6.1 ,p6.2为普通IO且都作输出  //    P6DIR |=  (BIT2|BIT1|BIT0);   //p6.0--PWR_UP,P6.1-TRX_CE,p6.2--TX_EN//                               P2SEL &= ~(BIT7|BIT6|BIT5);   //P2.5,P2.6,P2.7为普通IO且作输入  //    P2DIR &= ~(BIT7|BIT6|BIT5);   //p2.5--CD, p2.6--AM ,p2.7--DR    //                       P5SEL &= ~(BIT3|BIT2|BIT1|BIT0);  //P5.0--CSN    P5.2--MISO//    P5DIR |= (BIT3|BIT1|BIT0);       //P5.1--MOSI   P5.3--SCK//    P5DIR &= ~BIT2;        CSN_1;                            // SPI禁止    SCK_0;                            // SCK初始状态为低    PWR_1;                            // nRF905上电    TRX_CE_0;                            // nRF905进入待机模式    TXEN_0;                            // 接收模式 }                               void Init_Sys()                     //系统初始化 {    BCSCTL1 &=~XT2OFF;                 //启用XT2高速晶体振荡器                   do    { IFG1 &= ~OFIFG;                      // 清除振荡器失效标志                  for  (uint i = 0xFF; i > 0; i--);  // 延时,等待XT2起振          }    while ((IFG1 & OFIFG) != 0);              // 判断XT2是否起振,为0时振荡转换完成                   BCSCTL2 =SELM1+SELS;               // MCLK,SMCLK时钟为XT2    //串口初始设置    P3SEL |=( BIT6|BIT7);                // 串口端口--P3.6TX,P3.7RX                      P3DIR |= (BIT6|BIT5);              // P3.5为485TX/RX使能    P3OUT &= ~BIT5;                  // 使485初始为接收状态      ME2 = UTXE1 + URXE1;               // 使能串口模块1的TX/RX    UCTL1 |= CHAR;                     //8位字符格式    UTCTL1 |= SSEL1;                   //时钟源用SMCLK    UBR01  = 0x41;               //    UBR11  = 0x03;               //波特率为 9.6K    UMCTL1 = 0x49;               //平均分布安插3个位,即第0,3,6位(小数*8后约为3)    IE2   |= URXIE1;             //使能RX中断    UCTL1 &= ~SWRST;             //初始化USART状态机(注意用法) //=========================NRF905 SPI读函数(IO模拟SPI时序)================== uchar SpiRead (void) {     uchar i;     for (i=0;i<8;i++)         {             DATA_BUF=DATA_BUF<<1;  // 先读取最高位,保存至最末尾,再通过左移位完成整个字节           SCK_1;                 // 数据传一位,SPI时钟跳一下(注意读写时的不同用法)           if ((P5IN&BIT2))      // 如果P3.2为高 ,则DATA_BUF的0位为1;否则为0。                 {                    DATA_BUF |= 0x01;                 }           else                 {                    DATA_BUF &= ~(0x01);                 }           SCK_0;                         }      return DATA_BUF;           // 读完一个字节的值即返给函数SpiRead(void) } //=========================NRF905 SPI读写函数(IO模拟SPI时序)================== void SpiWrite(uchar send) {    uchar i;    DATA_BUF = 0x00;       DATA_BUF=send;                 // 把要写的字先送给缓存    for (i=0;i<8;i++)        {          if (((DATA_BUF&0x80) != 0))// 总是发送最高位             {                MOSI_1;            // 如果DATA_BUF的最高位为1,则写1;否则写0。             }         else             {                MOSI_0;             }            SCK_1;                     // 时钟跳一下(注间读与写的不同用法)         DATA_BUF=DATA_BUF<<1;      // *DATA_BUF按位左移1位,这时原DATA_BUF的后7位的值均向左         SCK_0;                     // *移一位,即原第6位成了现在的最高位,以此类推。        } } void Delay_ms(uint ms)             //毫秒为单位,8MHz为主时钟 {    uint i;    uint j;         for(i = ms;i > 0;i--)         {                 for(j = 2667;j > 0;j--);         }   // return; } void Delay_us(uint us)//微秒为单位,8MHz为主时钟 {    uint i;    uint j;         nCount = 3;         for(i = us;i > 0;i--)         {                 for(j =3;j > 0;j--);         }         //return; } void delay(uint s)            // {    uint i;    for(i=0; i<s; i++); } //==================================写RF配置寄存器的配置参数================================ void Config905(void) {    uchar i;    CSN_0;                            // 使能SPI    SpiWrite(WRC);                   // 先写写配置寄存器命令    for (i=0;i<10;i++)                    // 写放配置字,一共要写完配置寄存器里的11个字配置字        {            SpiWrite(RFConfig[i]);   // 注:一定是从第0字节写至10字节,这是由NRF905芯片决定的        }    CSN_1;                            //关闭SPI } //=========================NRF905装载地址+数据打包+数据发送===================== void TxPacket(void) {    uchar i;                           TXEN_1;                         //TX_EN=1    CSN_0;                        // 使能SPI    //delay(1000);    SpiWrite(WTP);                 // 写装载TX有效数据命令    for (i=0;i<32;i++)            // 写TX有效数据,从第0字写至31字        {           SpiWrite(RFTxBuf[i]);        }    CSN_1;                        // 写完后关闭SPI    Delay(1);                     // 延时                   CSN_0;                         // 再打开SPI    SpiWrite(WTA);                 // 写入地址要和接收方地址一样(本例中是4个字都是0X88)    for (i=0;i<4;i++)                 // 4字节地址        {           SpiWrite(TxAddress[i]);        }    CSN_1;                        // 再关闭SPI    TRX_CE_1;                        // 开始发射    void Delay_us(12);                // while (DR!=1);发射延时12uS以确保发送完毕    TRX_CE_0;                        // 关闭芯片TX/RX } //=========================NRF905接收数据===================== void RxPacket(void)                                                {     TXEN_0;                     //接收模式     TRX_CE_1;                   //使能接收     //Delay_us(650);     while ((P2IN&BIT7))           //当DR为1       {         TRX_CE_0;         CSN_0;                        // SPI使能        // Delay(1);         SpiWrite(RRP);          // 写读SPI数据命令         for (uchar i = 0 ;i < 32 ;i++)           {                RFRxBuf[i]=SpiRead(); // 读取数据送到RX缓存              }         CSN_1;                  //禁止SPI         Delay(10);         //TRX_CE_1;                                                             } } void main() {   WDTCTL = WDTPW + WDTHOLD; //禁止看门狗   Init_Sys();   NRF905_IO_init();   _EINT();   while(1)   {    while(!(IFG2&UTXIFG1)) // 若发送缓存为空    {       P3OUT |= BIT5;       //(485TX)       RxPacket();       for (uchar i = 0 ;i < 32 ;i++)       {           TXBUF1 = RFRxBuf[i];       }       P3OUT &= ~ BIT5;    }      } } #pragma vector = USART1RX_VECTOR __interrupt void Usart1RX() {   TxPacket();   P3OUT &= ~ BIT5;   for ( uchar i = 0 ;i < 32 ;i++)       {                    RFRxBuf[i] = RXBUF1;       } } IAR EW430版本是V4.1的,错误信息是这样的 main.c   Error[Pe065]: expected a ";" J:\自编程NRF905\main.c 95 Warning[Pe012]: parsing restarts here after previous syntax error J:\自编程NRF905\main.c 201 Warning[Pe223]: function "SpiWrite" declared implicitly J:\自编程NRF905\main.c 217 Warning[Pe676]: using out-of-scope declaration of function "SpiRead" (declared at line 94) J:\自编程NRF905\main.c 220 Warning[Pe223]: function "Delay" declared implicitly J:\自编程NRF905\main.c 223 Warning[Pe223]: function "TxPacket" declared implicitly J:\自编程NRF905\main.c 254 Error while running C/C++ compiler Done. 1 error(s), 5 warning(s)
    2. STM8S103仿真时出的问题!! 9/5052 stm32/stm8 2010-08-12
                                       
      为什么是0X8000? 这些在哪里有说明啊!!!?? 请指点。。。。。。。。。
      数据手册,你不看吗?
    3. 关于用飞思卡尔16位HCS12做电子琴 10/5759 嵌入式系统 2010-06-18
      引用 4 楼 peasant_lee 的回复: 有pwm的话,PWM可以的,也比较方便的。也可以用定时器输出功能,也可以。不是上M级的频率,我想应该可以发出。不过我关心的是,你是用什么来切换这些频率到蜂鸣器的?你应该只有一个蜂鸣器吧?
      恩……我有在网上看到用PWN控制的,可是因为老师没教所以看不懂……只有一个蜂鸣器,接口是111……
    4. 关于UART接收数据 10/4089 嵌入式系统 2010-06-12
      友情up
    5. C51和AVR51的C语言的电子仿真 7/4046 编程基础 2010-06-09
      顶123楼
    6. ADS1.2中 unsigned int 占几字节?? 2/4145 嵌入式系统 2010-05-08
      四个字节,怕记乱了可以使用char short long
    7. arm与单片机的区别 32/11504 ARM技术 2010-03-29
      感觉就是即使ARM再强悍,很多功能都用简单的单片机都能实现
    8. 卖几个AVR单片机和一本《深入浅出MFC》书 8/4009 嵌入式系统 2010-03-24
      支持!,呵呵。
    9. 133M的频率,显示2个不同的图像? 有点怀疑速度是不是太低了?
    10. 让GPRS模块智能化,嵌入应用更轻松 5/2465 嵌入式系统 2010-03-19
      那是你以前看到的,我这个是单模块方案,极具性价比的,比你看到的便宜一半
    11. GPRS模块开发求助(高分求助) 10/32010 嵌入式系统 2010-02-26
      一种是用AT指令上网一种是用拨号指令上网啊。 内嵌协议栈的可以使用AT命令连接网络,如果没有内部协议栈,就得用拨号的方式了。 还有就是我想把自己的电脑作为SERVER让模块连接可是要怎么做呢,要不要装什么软件,怎样设置可侦听端口 在路由器上添加一个针对本机的端口映射,在本机上打开一个SERVER(网上有得下),将模块的IP地址和端口设置为本机的外网地址和刚刚映射的端口,就可以建立连接了。
    12. ARM板上如何增加显卡芯片 24/10721 ARM技术 2010-02-24
      引用 5 楼 oneonce 的回复: 引用 4 楼 xumercury 的回复: 引用 3 楼 oneonce 的回复:引用 1 楼 xumercury 的回复: 显示IC?不是都和屏是捆绑配套的吗。。。这个IC是有的。例如说MPU的屏就在LCD板子上,AU或者其他的屏都是有屏驱动的。没有屏驱动IC不知道如何能点亮屏。除非ARM上自己带了能驱动屏的功能部件。 我的意思是我编出一个NK,不管在多大尺寸屏上都能显示正常。应该是有这样的IC的,我似乎见过别人2440这样做了。 这样不提高产品成本了? 这只是我一个想法,我们暂不考虑成本问题,只讨论可行性问题。~_~
      理论上是可以的。。。如果是理论上的话,可以尝试写一个屏尺寸判别的程序来判断下大小后根据大小来调用不同的驱动,当然,这样的结果是一个NK里面可能要放多个屏驱动,如果IC的话也要写一个判断屏大小的部分,然后送不同尺寸的初始化值。思路就这样了。。。具体IC。。。不明。。可以找找MStar或者做屏驱动的IC厂商咨询下。。。
    13. tim1是否能输出互为180度的PWM? 27/14482 stm32/stm8 2009-12-25
                                       STM32的TIM1有三对互补输出,使能互补输出直接产生互为180度相位的2路PWM输出。 如果不使用TIM1,可以用2楼的办法。
    14. FET430 UIF下载问题 13/6671 微控制器 MCU 2009-11-24
      test脚接了吗?
    15. 读取HID设备数据时ReadFile超时的问题 10/15335 嵌入式系统 2009-11-20
      疯了!我用DDK自带的那个hclient例子来试,HidD_GetInputReport同样是超时(错误代码121)! 只有Bus Hound才能捉到它发来的设备,不知道Bus Hound大致是什么样的工作原理? 这块板子好神奇啊!
    16. ADS下如何声明一个空的结构体? 5/3952 嵌入式系统 2009-11-16
      我现在在移植linux程序到ADS下. zhoushunda960的方法OK. 谢谢!
    17. 学了单片机后该怎样确定自己的方向 12/5749 嵌入式系统 2009-11-10
      可以从事的行业太广了: 1。手机软硬件工程师 2。小家电控制电路软硬件工程师 3。消费产品控制电路软硬件工程师 4。复杂一些的电讯类产品软硬件工程师(化为/中兴等) 5。职能识别类行业软硬件工程师(射频卡/指纹等)
    18. 共享资源:sc2410BSP wince5.0\6.0+binfs 17/6389 嵌入式系统 2009-09-27
      支持楼主 接分咯
    19. 上电前插入USB设备,启动后无法识别 23/10515 嵌入式系统 2009-09-16
      学习
    20. 播放音乐时,随机出现持续噼啪声 11/3352 嵌入式系统 2009-08-10
      确定,只是buffer小的时候,会有噼啪声

最近访客

< 1/1 >

统计信息

已有62人来访过

  • 芯积分:--
  • 好友:--
  • 主题:6
  • 回复:65

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言