打印
[STM32F1]

请问有人调试过SCA100T这个倾角传感器吗?

[复制链接]
467|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuhany|  楼主 | 2021-12-1 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问有人调试过SCA100T这个倾角传感器吗?

使用特权

评论回复
沙发
yszong| | 2021-12-1 23:10 | 只看该作者

楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
wuhany|  楼主 | 2021-12-1 23:13 | 只看该作者
最近在使用STM32来调试SCA100T这个传感器,遇到了一些麻烦。使用硬件SPI,根据时序读取数值,但是发现不论怎么读取,都没有数值返回。

使用特权

评论回复
地板
wuhany|  楼主 | 2021-12-1 23:15 | 只看该作者
到网站上查找一些资料,发现有人说要用模拟的SPI,才可以读取到数据,但是我发现还是不行。

使用特权

评论回复
5
wuhany|  楼主 | 2021-12-1 23:16 | 只看该作者
目前没有思路去调试这个传感器了,不知道该往哪个方向进行问题的排查。请各位大佬帮忙看看,一起讨论下如何解决这个问题。

使用特权

评论回复
6
renyaq| | 2021-12-1 23:19 | 只看该作者
如果模拟SPI时序不行;
用示波器看下发的波形对不对的;

使用特权

评论回复
7
zhanghqi| | 2021-12-1 23:22 | 只看该作者
还有咨询做传感器的原厂FAE,他们对这个比较熟;

使用特权

评论回复
8
chuxh| | 2021-12-1 23:24 | 只看该作者
还是要看时序,和硬件和软件模拟区别不大个人认为;

使用特权

评论回复
9
supernan| | 2021-12-1 23:27 | 只看该作者
SPI支持的模式,一般由四种,看芯片支持的SPI模式;CPOL CPHA

使用特权

评论回复
10
zhanghqi| | 2021-12-1 23:30 | 只看该作者
片选引脚是否正常

使用特权

评论回复
11
jlyuan| | 2021-12-1 23:33 | 只看该作者
SPI速度放慢点调试

使用特权

评论回复
12
juventus9554| | 2021-12-1 23:37 | 只看该作者
硬件SPI的IO配置是否正确

使用特权

评论回复
13
chenjunt| | 2021-12-1 23:40 | 只看该作者
完整的读取芯片的时序,你可以上传你的代码和芯片资料,帮你看下!

使用特权

评论回复
14
huangchui| | 2021-12-1 23:42 | 只看该作者
我用逻辑分析仪抓了时序来分析了,是按照数据手册上的时序走的。所以我就没有方向调试了。硬件SPI提供的时序应该更精确才对。

使用特权

评论回复
15
wuhany|  楼主 | 2021-12-1 23:44 | 只看该作者
这个是SPI引脚和SPI的设置。
static void SPI1_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   /* Enable  GPIO clocks */
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;               /*!< Configure SPI1 pins: SCK */
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;               /*!< Configure SPI pins: MISO */
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;               /*!< Configure SPI pins: MOSI */
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;               /*!< Configure SPI_CS_PIN pin: SPI Card CS pin */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_4);                         /* Deselect the FLASH: Chip Select high */
}





/**
  * @brief  SPI1 ¹¤×÷ģʽ ÅäÖÃ
  * @param  ÎÞ
  * @retval ÎÞ
        * @notice ÓÃÓÚADS1256_µÄͨÐÅ £¬×î´óʱÖÓΪ 2M
  */
static void SPI1_MODE_Config(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);    /*!<SPI Periph clock enable */

        SPI_I2S_DeInit(SPI1);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize  = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL      = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA      = SPI_CPHA_1Edge;//SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS       = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  SPI_InitStructure.SPI_FirstBit  = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;      /*²»Ö§³ÖCRCУÑ飬ËùÒÔÕâ¸ö²ÎÊýûÓÐÓ㬿ÉÒÔËæ±ãÅäÖÃ*/
  SPI_Init(SPI1, &SPI_InitStructure);
  SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_TXE);
  SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_RXNE);
        SPI_Cmd(SPI1, ENABLE);                        /* Enable SPI1  */
}

这个是读取数据的流程

void SCA100T_Init(void)
{
    uint8_t cmd_MEAS = MEAS;

    SPI_CS_Clr();
    delay_us(1);
    Spi_write(&cmd_MEAS,1);
    delay_us(1);
    SPI_CS_Set();
}

void SCA100T_ReadReg(uint8_t addr,uint8_t buffer[],uint8_t n)
{
    uint8_t i = 0,ret = 0;

    SPI_CS_Set();
    delay_us(150);
    SPI_CS_Clr();
    delay_us(1);
    Spi_write(&addr,1);
    for(i = 0; i < n; i++)
    {
        Spi_read(&ret,1);
        buffer = ret;
    }
    delay_us(2);
    SPI_CS_Set();
}

uint16_t SCA100T_GetX(void)
{
    uint8_t bufx[2] = {0,0};
    uint16_t DATA_X = 0;

    SCA100T_ReadReg(RDAX,bufx,2);

    DATA_X = bufx[0] << 8 |bufx[1];

    return DATA_X;
}

uint16_t SCA100T_GetY(void)
{
    uint8_t bufy[2] = {0,0};
    uint16_t DATA_Y = 0;

    SCA100T_ReadReg(RDAY,bufy,2);

    DATA_Y = bufy[0] << 8 |bufy[1];

    return DATA_Y;
}

uint8_t SCA100T_GetTemp(void)
{
    uint8_t data,cmd_RWTR;
    cmd_RWTR = RWTR;

    SPI_CS_Set();
    delay_us(150);
    SPI_CS_Clr();
    delay_us(1);
    Spi_write(&cmd_RWTR,1);
    delay_us(1);
    Spi_read(&data,1);
    delay_us(2);
    SPI_CS_Set();

    return data;
}

使用特权

评论回复
16
dengdc| | 2021-12-1 23:46 | 只看该作者
你的SPI的读写函数呢,看起来问题不是太大。目前进度怎么样了?

使用特权

评论回复
17
zhanghqi| | 2021-12-1 23:48 | 只看该作者
看了芯片手册和你的代码,还没看到SPI的操作代码,逻辑没大问题,保证延时够,然后看时序很简单,片选选择,然后发命令字符,然后读数据;拉低片选;

使用特权

评论回复
18
yszong| | 2021-12-1 23:51 | 只看该作者
需要原版的芯片数据手册

使用特权

评论回复
19
wuhany|  楼主 | 2021-12-1 23:53 | 只看该作者
貌似可以了,但是读出来的数不是很准确。没有,这个只是作为参考用的,实际测量还是通过ADC来转换得到角度的。

使用特权

评论回复
20
kangzj| | 2021-12-1 23:54 | 只看该作者
物理连接没问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

879

主题

10435

帖子

4

粉丝