OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5659|回复: 4

关于LIS3DH与NRF24LE1之间通信问题请教

[复制链接]

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2018-3-28
在线时间
43 小时
发表于 2019-8-7 10:10:15 | 显示全部楼层 |阅读模式
100金钱
本帖最后由 xieyunsky 于 2019-8-7 11:06 编辑

       最近用lis3dh开发东西,和NRF24LE1之间进行SPI通信。用的是模拟SPI三线模式。需要配置为LIS3DH产生INT1中断给NRF24LE1来激活NRF24LE1进入工作模式。但是无论怎么样都把LIS3DH的寄存器配置不好,用示波器能看到MOSI和SCK有电平输出,但是永远都不能从LIS3DH的寄存器中读到数据。现在都不知道数据到底有没有能够通过SPI写入到LIS3DH的寄存器里面。CS片选信号已经硬件拉低。求大佬给点提示,要怎么弄

微信图片_20190806182006.jpg
图片中黄线是时钟线,绿线是数据线。前8位是要写入的寄存器地址0x0f(第一位置高表示要从该寄存器中读值),后8位是该寄存器中的数据(该寄存器原始数据应为0x07,读不出来,一直为0)。
下面是初始化LIS3DH部分:
  1. void lis3dh_init(void){

  2.         spi_init();
  3.         
  4.         LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x09);  //设置量程为2g,三线接口
  5.         delay1us(100);
  6.         
  7.         LIS3DH_WriteReg(LIS3DH_CTRL_REG1, 0x57);  //100Hz 正常模式 使能ZYX
  8.         delay1us(100);
  9.         
  10.         LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0x39); //启用INT1高通滤波
  11.         delay1us(100);
  12.         
  13.         LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0x40);  // INT1引脚上的中断发生器 1
  14.         delay1us(100);
  15.                
  16.         LIS3DH_WriteReg(LIS3DH_CTRL_REG5, 0x08);  //锁存中断请求
  17.         delay1us(100);
  18.         
  19.         LIS3DH_WriteReg(LIS3DH_INT1_CFG, 0xaa);  //中断源  zyx低
  20.         delay1us(100);
  21.         
  22.         LIS3DH_WriteReg(LIS3DH_INT1_THS, 0x02);  //设置中断1阈值
  23.         delay1us(100);
  24.         
  25.         LIS3DH_WriteReg(LIS3DH_INT1_DURATION, 0);  //中断持续时间
  26.         delay1us(100);
  27.                
  28.         LIS3DH_ReadReference();
  29. }
复制代码
下面是模拟三线SPI收发部分:
  1. void SPISendByte(u8 ch)
  2. {
  3.   u8 i;
  4.         
  5.         P1DIR  &= 0xEF;                //p1.4为输出
  6.         delay1us(5);
  7.   SCK = 1 ;                      //时钟置高
  8.   for(i = 0; i < 8; i++)
  9.   {
  10.                 SCK = 0 ;                    //时钟置低
  11.     if(ch & 0x80){               //判断最高位,总是发送最高位
  12.                         MOSI = 1;                  //MOSI输出1,数据总线准备数据1
  13.                 }
  14.     else{
  15.                         MOSI = 0;                  //MOSI输出0,数据总线准备数据0
  16.                 }
  17.                 delay1us(5);
  18.                 SCK = 1;                     //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件               
  19.                 delay1us(5);
  20.     ch <<= 1;                    //左移抛弃已经输出的最高位
  21.   }
  22. }
  23. /******************************************************************
  24. **name      : SPIreceiveByte
  25. **fun       : 接收一字节数据
  26. **arguments : void
  27. **return    : 接收的数据
  28. **date      : 2019/7/23
  29. **by        : @曼珠沙华
  30. *******************************************************************/
  31. u8 SPI_Read_OneByte(void)
  32. {
  33.   u8 i;
  34.   u8 temp = 0;
  35.         
  36.         MOSI = 0;
  37.         delay1us(5);
  38.         P1DIR |= 0x10;               //p1.4设为输入
  39.         delay1us(5);
  40.   SCK = 1;                     //时钟置高
  41.   for(i = 0; i < 8; i++){
  42.                 temp <<= 1;                //读取MISO 8次输入的值,存入temp。之所以不放在“SCK = 0”语句之后的位置是因为:
  43.                                                                                      //读取最后1byte的最后一位(即LSB)之后,不能再左移了  
  44.                 SCK = 0;                   //时钟为低
  45.                 if(MOSI){                  //读取最高位,保存至最末尾,通过左移位完成读整个字节
  46.                         temp |= 0x01;
  47.                 }
  48.                 else{
  49.                         temp &= ~0x01;
  50.                 }
  51.                 delay1us(5);
  52.                 SCK = 1;                   //上升沿来了(SCK从0-->1),MOSI上的数据将发生改变,稳定后读取存入temp
  53.                 delay1us(5);
  54.   }

  55.   return temp;
  56. }
复制代码
下面是主函数部分:
  1. void main(void){

  2.         u8 i,m1 = 0xCC;
  3.         int lisid=0;
  4.   u8 lisidtemp=0;
  5.          
  6.         GPIO_Init();             //初始化GPIO
  7.         RF_init();               //初始化RF
  8.         uart0_init(38400);       //初始化串口 设置波特率为38400
  9.         delay1ms(2000);          //等待稳定
  10.         lis3dh_init();           //初始化运动传感器
  11.         
  12.         EA = 1;                  //允许中断
  13.         
  14.         /*上电闪灯5次*/
  15.         for(i = 0; i < 5; i++){
  16.                 LED = 1;
  17.                 delay1ms(500);
  18.                 LED = 0;
  19.                 delay1ms(500);
  20.         }
  21.         
  22.         while(1){
  23.                 LIS3DH_ReadReg(LIS3DH_WHO_AM_I, &int1_src);
  24.                 delay1ms(3000);
  25.         }                                
  26. }
复制代码
求大佬指点。。。


最佳答案

查看完整内容[请看2#楼]

问题已解决。已实现INT1中断以及加速度值的读取。各位要是需要可以复制本帖源码。源码保证准确无误,问题出在硬件上面。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2018-3-28
在线时间
43 小时
 楼主| 发表于 2019-8-7 10:10:16 | 显示全部楼层
问题已解决。已实现INT1中断以及加速度值的读取。各位要是需要可以复制本帖源码。源码保证准确无误,问题出在硬件上面。
回复

使用道具 举报

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2018-3-28
在线时间
43 小时
 楼主| 发表于 2019-8-7 15:19:33 | 显示全部楼层
来个大佬指点一下呀。别沉了。
回复

使用道具 举报

7

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2018-3-28
在线时间
43 小时
 楼主| 发表于 2019-8-8 09:16:02 | 显示全部楼层
有人用过这个吗 大佬指点一下呀@正点原子
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-8-9 02:28:36 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 09:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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