找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1806|回复: 1
收起左侧

MSP430F5438单片机控制LT8920射频模块问题

[复制链接]
ID:669348 发表于 2019-12-21 10:11 | 显示全部楼层 |阅读模式
公司旧项目供应商使用MSP430F5438控制LT8920射频模块做遥控通讯,因原供应商主程序问题,目前转为自己开发程序,供应商不提供原始代码。目前在配置LT8920时无法初始化,请各位大佬看看,这个LT8920模块要怎样驱动起来

单片机源程序如下:
pin脚配置
  1. P1DIR |= BIT0 ;                                                        //IR -> RST
  2.   P1OUT &= ~BIT0 ;                                                        //DEFAULT SET LOW
  3.   P5DIR |= BIT0 ;                                                        //CS -> SPI_CLK
  4.   P5OUT &= ~BIT0 ;                                                        //DEFAULT SET LOW
  5.   P6DIR |= BIT7 ;                                                        //SC -> SPI_SS
  6.   P6OUT |= BIT7 ;                                                        //DEFAULT SET HIGH   
  7.   P7DIR |= BIT4 ;                                                        //MO -> MOSI
  8.   P7OUT &= ~BIT4 ;                                                        //DEFAULT SET LOW     
  9.   P7DIR &= ~(BIT5 + BIT6) ;                                        //MI -> MISO
  10.                                                                                         //CE -> PKT
复制代码
宏定义
  1. #define RST(x)                        (x)? (P1OUT |= BIT0) : (P1OUT &= ~BIT0)
  2. #define SPI_SS(x)                (x)? (P6OUT |= BIT7) : (P6OUT &= ~BIT7)
  3. #define SPI_CLK(x)                (x)? (P5OUT |= BIT0) : (P5OUT &= ~BIT0)
  4. #define MOSI(x)                        (x)? (P7OUT |= BIT4) : (P7OUT &= ~BIT4)
  5. #define MISO                        (P7IN & BIT5)
  6. #define PKT                                (P7IN & BIT6)
复制代码
写寄存器
  1. void SPI_WriteReg(unsigned char addr, unsigned char H, unsigned char L)
  2. {
  3.         int i;
  4.         SPI_SS(OFF);
  5.         delay_us(5);

  6.         for(i = 0; i < 8; ++ i)
  7.         {
  8.                 MOSI((addr & 0x80));
  9.                 delay_us(5);
  10.                 SPI_CLK(ON);
  11.                 delay_us(5);
  12.                 SPI_CLK(OFF);                                                //capturing at the down side
  13.                 delay_us(5);
  14.                 addr = addr << 1;                   //There is no Delay here. determines the rate of SPI.
  15.         }

  16.         for(i = 0; i < 8; ++i)                         //Write H
  17.         {
  18.                 MOSI((H & 0x80));
  19.                 delay_us(5);
  20.                 SPI_CLK(ON);
  21.                 delay_us(5);
  22.                 SPI_CLK(OFF);                                                //capturing at the down side
  23.                 delay_us(5);
  24.                 H = H << 1;
  25.         }

  26.         for(i = 0; i < 8; ++i)                 //Write L
  27.         {  
  28.                 MOSI((L & 0x80));
  29.                 delay_us(5);
  30.                 SPI_CLK(ON);
  31.                 delay_us(5);
  32.                 SPI_CLK(OFF);                                                //capturing at the down side
  33.                 delay_us(5);
  34.                 L = L << 1;
  35.         }
  36.         SPI_SS(ON);
  37.         delay_us(5);
  38. }
复制代码

读寄存器
  1. void SPI_ReadReg(unsigned char addr)
  2. {
  3.         int i;
  4.         SPI_SS(OFF);
  5.         delay_us(5);
  6.         //addr += 0x80;                                    //when reading a Register,the Address should be added with 0x80.
  7.         addr |= 0x80;                                                        //bit7 1:read,0:write

  8.         for(i = 0; i < 8; ++ i)
  9.         {
  10.                 MOSI((addr & 0x80));
  11.                 delay_us(5);
  12.                 SPI_CLK(ON);
  13.                 delay_us(5);
  14.                 SPI_CLK(OFF);                                                //capturing at the down side
  15.                 delay_us(5);
  16.                 addr = addr << 1;                   //Move one bit to the left.
  17.         }

  18.         for(i = 0; i < 8; ++ i)
  19.         {
  20.                 SPI_CLK(ON);
  21.                 delay_us(5);
  22.                 SPI_CLK(OFF);                                                //capturing at the down side
  23.                 delay_us(5);
  24.                
  25.                 RegH = RegH << 1;  
  26.                 RegH |= MISO;
  27.         }
  28.         
  29.         for(i = 0; i < 8; ++ i)
  30.         {
  31.                 SPI_CLK(ON);
  32.                 delay_us(5);
  33.                 SPI_CLK(OFF);                                                //capturing at the down side
  34.                 delay_us(5);

  35.                 RegL = RegL << 1;
  36.                 RegL |= MISO;
  37.         }
  38.         SPI_SS(ON);
  39.         delay_us(5);
  40. }
复制代码

LT8920初始化
  1. void LT8900_Init(void)
  2. {
  3.         RST(OFF);
  4.         delay_ms(4);                                                                        //delay 4ms
  5.         RST(ON);
  6.         delay_ms(8);                                                                        //delay 8ms for 晶振稳定
  7.         
  8.         SPI_WriteReg( 0, 0x6f, 0xef );                                        //default
  9.         SPI_WriteReg( 1, 0x56, 0x81 );                                        //default
  10.         SPI_WriteReg( 2, 0x66, 0x17 );                                        //default 6619/6617
  11.         SPI_WriteReg( 4, 0x9c, 0xc9 );                                        //default 5447/9cc9
  12.         SPI_WriteReg( 5, 0x66, 0x37 );                                        //default f000/6637
  13.         SPI_WriteReg( 7, 0x00, 0x00 );                                        //channel is 2402Mhz
  14.         SPI_WriteReg( 8, 0x6c, 0x90 );                                        //default 71af/6c90
  15.         SPI_WriteReg( 9, 0x48, 0x00 );                                          //PA -12.2dbm
  16.         SPI_WriteReg(10, 0x7f, 0xfd );                                        //Crystal osc. enable
  17.         SPI_WriteReg(11, 0x00, 0x08 );                                        //RSSI enabled
  18.         SPI_WriteReg(12, 0x00, 0x00 );                                        //default
  19.         SPI_WriteReg(13, 0x48, 0xbd );                                        //default
  20.         SPI_WriteReg(22, 0x00, 0xff );                                        //default
  21.         SPI_WriteReg(23, 0x80, 0x05 );                                        //Calibrate VCO before each and every Tx/Rx.
  22.         SPI_WriteReg(24, 0x00, 0x67 );                                        //default
  23.         SPI_WriteReg(25, 0x16, 0x59 );                                        //default
  24.         SPI_WriteReg(26, 0x19, 0xe0 );                                        //default
  25.         SPI_WriteReg(27, 0x13, 0x00 );
  26.         SPI_WriteReg(28, 0x18, 0x00 );                                        //default
  27.         SPI_WriteReg(32, 0x48, 0x00 );                                        //8920在62.5kbps下同步头只能是32或16bit
  28.         SPI_WriteReg(33, 0x3f, 0xc7 );                                        //Configures packet sequencing
  29.         SPI_WriteReg(34, 0x20, 0x00 );                                        //Configures packet sequencing
  30.         SPI_WriteReg(35, 0x05, 0x00 );                                    //Auto Ack max Tx retries = 4

  31.         SPI_WriteReg(36, 0x03, 0x80 );                                        //sync word
  32.         SPI_WriteReg(37, 0x03, 0x80 );                                        //sync word
  33.         SPI_WriteReg(38, 0x5a, 0x5a );                                        //sync word
  34.         SPI_WriteReg(39, 0x03, 0x80 );                                        //sync word

  35.         SPI_WriteReg(40, 0x44, 0x02 );                                        //Configure FIFO flag, sync threshold, 1bit可错
  36.         SPI_WriteReg(41, 0xb8, 0x00 );                        /*CRC is ON; scramble is OFF; AUTO_ACK is ON*/
  37.         
  38.         SPI_WriteReg(42, 0xfd, 0xb0 );                                        /*等待RX_ACK时间 176us*/
  39.         
  40.         SPI_WriteReg(43, 0x00, 0x0f );
  41.         SPI_WriteReg(44, 0x10, 0x00 );                                       
  42.         SPI_WriteReg(45, 0x05, 0x52 );                                        //62.5Kbps
  43.         SPI_WriteReg(50, 0x00, 0x00 );
  44.         delay_ms(100);
  45. }
复制代码

主程序初始化后再读寄存器,无法正确读取,无法确认是初始化不成功还是读取不成功
  1.         LT8900_Init( );

  2.         //读出寄存器的值检查硬件读写时序是否正确
  3.         SPI_ReadReg(40);
  4.         if ((RegH==0x44) && (RegL==0x02))
  5.         {
  6.                 //NIGHTLIGHT(ON);
  7.                 LED_P(ON);
  8.                 //Delay_ms(200);
  9.                 //__delay_cycles(160000);
  10.                 //NIGHTLIGHT(OFF);
  11.                 Uart0_Send(Welcome,12);
  12.         }
  13.         else
  14.                 //LED_P(ON);
  15.                 NIGHTLIGHT(ON);
复制代码





回复

使用道具 举报

ID:669348 发表于 2019-12-24 11:37 | 显示全部楼层
已解决了,MSP430pin脚读取后续进行移位才能进行位操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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