中级会员
- 积分
- 293
- 金钱
- 293
- 注册时间
- 2018-3-28
- 在线时间
- 43 小时
|
100金钱
本帖最后由 xieyunsky 于 2019-8-7 11:06 编辑
最近用lis3dh开发东西,和NRF24LE1之间进行SPI通信。用的是模拟SPI三线模式。需要配置为LIS3DH产生INT1中断给NRF24LE1来激活NRF24LE1进入工作模式。但是无论怎么样都把LIS3DH的寄存器配置不好,用示波器能看到MOSI和SCK有电平输出,但是永远都不能从LIS3DH的寄存器中读到数据。现在都不知道数据到底有没有能够通过SPI写入到LIS3DH的寄存器里面。CS片选信号已经硬件拉低。求大佬给点提示,要怎么弄
图片中黄线是时钟线,绿线是数据线。前8位是要写入的寄存器地址0x0f(第一位置高表示要从该寄存器中读值),后8位是该寄存器中的数据(该寄存器原始数据应为0x07,读不出来,一直为0)。
下面是初始化LIS3DH部分:
- void lis3dh_init(void){
- spi_init();
-
- LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x09); //设置量程为2g,三线接口
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_CTRL_REG1, 0x57); //100Hz 正常模式 使能ZYX
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0x39); //启用INT1高通滤波
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0x40); // INT1引脚上的中断发生器 1
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_CTRL_REG5, 0x08); //锁存中断请求
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_INT1_CFG, 0xaa); //中断源 zyx低
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_INT1_THS, 0x02); //设置中断1阈值
- delay1us(100);
-
- LIS3DH_WriteReg(LIS3DH_INT1_DURATION, 0); //中断持续时间
- delay1us(100);
-
- LIS3DH_ReadReference();
- }
复制代码 下面是模拟三线SPI收发部分:
- void SPISendByte(u8 ch)
- {
- u8 i;
-
- P1DIR &= 0xEF; //p1.4为输出
- delay1us(5);
- SCK = 1 ; //时钟置高
- for(i = 0; i < 8; i++)
- {
- SCK = 0 ; //时钟置低
- if(ch & 0x80){ //判断最高位,总是发送最高位
- MOSI = 1; //MOSI输出1,数据总线准备数据1
- }
- else{
- MOSI = 0; //MOSI输出0,数据总线准备数据0
- }
- delay1us(5);
- SCK = 1; //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件
- delay1us(5);
- ch <<= 1; //左移抛弃已经输出的最高位
- }
- }
- /******************************************************************
- **name : SPIreceiveByte
- **fun : 接收一字节数据
- **arguments : void
- **return : 接收的数据
- **date : 2019/7/23
- **by : @曼珠沙华
- *******************************************************************/
- u8 SPI_Read_OneByte(void)
- {
- u8 i;
- u8 temp = 0;
-
- MOSI = 0;
- delay1us(5);
- P1DIR |= 0x10; //p1.4设为输入
- delay1us(5);
- SCK = 1; //时钟置高
- for(i = 0; i < 8; i++){
- temp <<= 1; //读取MISO 8次输入的值,存入temp。之所以不放在“SCK = 0”语句之后的位置是因为:
- //读取最后1byte的最后一位(即LSB)之后,不能再左移了
- SCK = 0; //时钟为低
- if(MOSI){ //读取最高位,保存至最末尾,通过左移位完成读整个字节
- temp |= 0x01;
- }
- else{
- temp &= ~0x01;
- }
- delay1us(5);
- SCK = 1; //上升沿来了(SCK从0-->1),MOSI上的数据将发生改变,稳定后读取存入temp
- delay1us(5);
- }
- return temp;
- }
复制代码 下面是主函数部分:
- void main(void){
- u8 i,m1 = 0xCC;
- int lisid=0;
- u8 lisidtemp=0;
-
- GPIO_Init(); //初始化GPIO
- RF_init(); //初始化RF
- uart0_init(38400); //初始化串口 设置波特率为38400
- delay1ms(2000); //等待稳定
- lis3dh_init(); //初始化运动传感器
-
- EA = 1; //允许中断
-
- /*上电闪灯5次*/
- for(i = 0; i < 5; i++){
- LED = 1;
- delay1ms(500);
- LED = 0;
- delay1ms(500);
- }
-
- while(1){
- LIS3DH_ReadReg(LIS3DH_WHO_AM_I, &int1_src);
- delay1ms(3000);
- }
- }
复制代码 求大佬指点。。。
|
最佳答案
查看完整内容[请看2#楼]
问题已解决。已实现INT1中断以及加速度值的读取。各位要是需要可以复制本帖源码。源码保证准确无误,问题出在硬件上面。
|