[原创] 基于PSOC6开发板模拟I2C 解X-NUCLEO-IKS01A3的STTS751;

DavidZH   2019-7-27 21:25 楼主

          周末终于有时间来研究下X-NUCLEO-IKS01A3,先从简单的开始,STTS751  是ST的I2C接口的数字温度传感器;

硬件: STTS751  是接的I2C1, 地址0x94, 电压是不常见的2.5V,如果是单独用的话,还得加LDO;

image.png
软件: 

       I2C 底层协议:开始,结束, 发数据和接受数据,ACK, NACK; 具体要看怎么自己怎么写;

void I2C_Start(void);
void I2C_Stop(void);

uint8_t I2C_Send_Byte(uint8_t oneByte);   
uint8_t I2C_Read_Byte(uint8_t bLSByte);

       大概的流程图很简单, 写器件地址,写寄存器地址和读数据即可;
image.png

uint8_t  STTS751_Write_Cmd(uint8_t SlaveAddress, uint8_t RegAddress,  uint8_t Cmd)
{
     uint8_t succ, stime=0;
    
     I2C_Start();
     succ = I2C_Send_Byte(SlaveAddress & 0xfe);
     while((succ !=1) &&(stime <3))
    {
        I2C_Stop();
        I2C_Start();
        succ = I2C_Send_Byte(SlaveAddress & 0xfe);
        stime++;
    }
    succ = I2C_Send_Byte(RegAddress);
    succ = I2C_Send_Byte(Cmd);
    I2C_Stop(); 
    return succ;
}

 uint8_t STTS751_Read_Date(uint8_t SlaveAddress, uint8_t RegAddress)
{
    uint8_t recvDate;
    uint8_t succ, stime=0;
    
    I2C_Start();
    succ = I2C_Send_Byte(SlaveAddress & 0xfe);
    while((succ !=1)&&(stime<3))
    {
        I2C_Stop();
        I2C_Start();
        succ = I2C_Send_Byte(SlaveAddress & 0xfe);  //写
        stime++;
    }
    I2C_Send_Byte(RegAddress);
    
    I2C_Start();
    I2C_Send_Byte(SlaveAddress | 0x01);  //读
    recvDate = I2C_Read_Byte(1);   //NACK
    I2C_Stop();
    return recvDate;
}

从原理图上看给的地址是0x94;

Main 函数如下:

 int main(void)
{
    uint8_t PID;
    uint8_t TempH, TempL;
    double Temp; 
   
    Cy_SCB_UART_Init(Uart_Printf_HW, &Uart_Printf_config, &Uart_Printf_context);
    Cy_SCB_UART_Enable(Uart_Printf_HW);
    

    __enable_irq(); /* Enable global interrupts. */
    
    for(;;)
    {
        while(1)
        {
           PID =STTS751_Read_Date(0x94, 0xfe);
           TempH = STTS751_Read_Date(0x94, 0x00);
           printf("TempH = %d \r\n", TempH);
           printf("PID = %X \r\n", PID);
       }
   }
}

有个Production ID,还有一个温度值, 32℃, 好热啊!!!

image.png

PSOC6 和X-NUCLEO-IKS01A3还挺配的,有秋水共长天一色的感觉;

image.png
此内容由EEWORLD论坛网友DavidZH原创,如需转载或用于商业用途需征得作者同意并注明出处

本帖最后由 DavidZH 于 2019-7-27 21:35 编辑
  • image.png
  • image.png
  • image.png
  • image.png

回复评论 (3)

为什么不把两个板子直接叠起来?不是更方便?

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2019-7-27 22:12
littleshrimp 发表于 2019-7-27 22:12 为什么不把两个板子直接叠起来?不是更方便?

多谢提醒,的确;

ST_X-NUCLEO-IKS01A3 板子上有2组I2C, 其中I2C1 接HTS221,LPS22HH,STTS751,连接在开发板上, 另外一组I2C2, 连接LIS2DW12,LSM6DSO 连接板子的SDA,SCL,  可以直接和开发板连接;

image.png

image.png

本帖最后由 DavidZH 于 2019-7-27 23:04 编辑
  • image.png
  • image.png
点赞  2019-7-27 22:52

PSOC6_IKS01A3_Code.zip (3.81 MB)
(下载次数: 14, 2019-9-24 20:57 上传)
附上工程,拍砖

点赞  2019-9-24 20:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复