ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

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

[复制链接]
161|12
 楼主 | 2019-12-1 15:49 | 显示全部楼层 |阅读模式
最近在使用STM32来调试SCA100T这个传感器,遇到了一些麻烦。
1.我使用硬件SPI,根据时序读取数值,但是发现不论怎么读取,都没有数值返回。
2.到网站上查找一些资料,发现有人说要用模拟的SPI,才可以读取到数据,但是我发现还是不行。

目前没有思路去调试这个传感器了,不知道该往哪个方向进行问题的排查。请各位大佬帮忙看看,一起讨论下如何解决这个问题。

使用特权

评论回复
| 2019-12-2 09:48 | 显示全部楼层
如果模拟SPI时序不行;
用示波器看下发的波形对不对的;

还有咨询做传感器的原厂FAE,他们对这个比较熟;

使用特权

评论回复

评论

link123 2019-12-2 11:29 回复TA
原厂的他们只有AVR的例程,我手上没有,没有办法进行验证。先用示波器看看吧! 
| 2019-12-2 12:21 | 显示全部楼层
还是要看时序,和硬件和软件模拟区别不大个人认为;

使用特权

评论回复

评论

jay8830095 2019-12-5 16:35 回复TA
@link123 : 看下以下几个方面: 1:SPI支持的模式,一般由四种,看芯片支持的SPI模式;CPOL CPHA; 2:片选引脚是否正常 3:SPI速度放慢点调试; 4:硬件SPI的IO配置是否正确? 5:完整的读取芯片的时序,你可以上传你的代码和芯片资料,帮你看下! 
link123 2019-12-3 20:39 回复TA
我用逻辑分析仪抓了时序来分析了,是按照数据手册上的时序走的。所以我就没有方向调试了。硬件SPI提供的时序应该更精确才对。 
 楼主 | 2019-12-9 15:39 | 显示全部楼层
jay8830095 发表于 2019-12-2 12:21
还是要看时序,和硬件和软件模拟区别不大个人认为;

这个是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;
}

使用特权

评论回复
 楼主 | 2019-12-9 15:41 | 显示全部楼层
jay8830095 发表于 2019-12-2 12:21
还是要看时序,和硬件和软件模拟区别不大个人认为;

这个是芯片的数据手册

SCA100T 英文说明书.pdf

1.55 MB, 下载次数: 1

使用特权

评论回复
| 2019-12-10 19:34 | 显示全部楼层
link123 发表于 2019-12-9 15:41
这个是芯片的数据手册

这几天在忙,没时间看,你的SPI的读写函数呢,看起来问题不是太大。目前进度怎么样了?

使用特权

评论回复

评论

link123 2019-12-15 11:19 回复TA
谢谢啊!稀里糊涂的就成功了。 
| 2019-12-10 19:46 | 显示全部楼层
看了芯片手册和你的代码,还没看到SPI的操作代码,逻辑没大问题,保证延时够,然后看时序很简单,片选选择,然后发命令字符,然后读数据;拉低片选;

使用特权

评论回复
| 2019-12-10 23:37 | 显示全部楼层
需要原版的芯片数据手册

使用特权

评论回复
 楼主 | 2019-12-15 11:18 | 显示全部楼层
jay8830095 发表于 2019-12-10 19:34
这几天在忙,没时间看,你的SPI的读写函数呢,看起来问题不是太大。目前进度怎么样了? ...

貌似可以了,但是读出来的数不是很准确。没有,这个只是作为参考用的,实际测量还是通过ADC来转换得到角度的。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖