周末终于有时间来研究下X-NUCLEO-IKS01A3,先从简单的开始,STTS751 是ST的I2C接口的数字温度传感器;
硬件: STTS751 是接的I2C1, 地址0x94, 电压是不常见的2.5V,如果是单独用的话,还得加LDO;
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);
大概的流程图很简单, 写器件地址,写寄存器地址和读数据即可;
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℃, 好热啊!!!
PSOC6 和X-NUCLEO-IKS01A3还挺配的,有秋水共长天一色的感觉;
此内容由EEWORLD论坛网友DavidZH原创,如需转载或用于商业用途需征得作者同意并注明出处
littleshrimp 发表于 2019-7-27 22:12 为什么不把两个板子直接叠起来?不是更方便?
多谢提醒,的确;
ST_X-NUCLEO-IKS01A3 板子上有2组I2C, 其中I2C1 接HTS221,LPS22HH,STTS751,连接在开发板上, 另外一组I2C2, 连接LIS2DW12,LSM6DSO 连接板子的SDA,SCL, 可以直接和开发板连接;
本帖最后由 DavidZH 于 2019-7-27 23:04 编辑