找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2394|回复: 3
打印 上一主题 下一主题
收起左侧

求助,stm32驱动AMG8833测温,INT和ADO两脚怎么连,查了说在代码里,但是看不出来

[复制链接]
跳转到指定楼层
楼主
ID:819036 发表于 2020-9-14 20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1.     1、AMG_IIC.h#ifndef __AMG_I2C_H
  2.     #define __AMG_I2C_H
  3.     #include "stdint.h"
  4.     #include "sys.h"
  5.     #include "delay.h"
  6.     #define AMG_SDA_RCC  RCC_APB2Periph_GPIOB
  7.     #define AMG_SDA_PIN  GPIO_Pin_7
  8.     #define AMG_SDA_IOx  GPIOB  
  9.     #define AMG_SCL_RCC  RCC_APB2Periph_GPIOB
  10.     #define AMG_SCL_PIN  GPIO_Pin_6
  11.     #define AMG_SCL_IOx  GPIOB  
  12.     #define AMG_SDA_IN()  {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=8<<28;}
  13.     #define AMG_SDA_OUT() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=3<<28;}
  14.     #define AMG_IIC_SCL    PBout(6)      //SCL
  15.     #define AMG_IIC_SDA    PBout(7)      //SDA         
  16.     #define AMG_READ_SDA   PBin(7)                  //输入SDA
  17.     #define AMG88xx_ADR    0xD0          //5脚拉低时的设备地址
  18.     //Status
  19.     #define STATUS_OK       0x00
  20.     #define STATUS_FAIL     0x01
  21.     void AMG8833_IIC_Init(void);
  22.     u8 AMG_IIC_Write_1Byte(u8 SlaveAddress, u8 REG_Address,u8 REG_data);
  23.     u8 AMG_IIC_Read_1Byte(u8 SlaveAddress, u8 REG_Address,u8 *REG_data);
  24.     uint8_t AMG_I2C_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len);
  25.     #endif
  26. 2、AMG_IIC.c
  27.     #include "AMG_IIC.h"
  28.     void AMG8833_IIC_Init(void)
  29.     {
  30.             GPIO_InitTypeDef GPIO_InitStructure;
  31.             RCC_APB2PeriphClockCmd(        AMG_SDA_RCC, ENABLE );      
  32.             GPIO_InitStructure.GPIO_Pin = AMG_SDA_PIN;               //端口配置
  33.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;       //推挽输出
  34.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //50Mhz速度
  35.             GPIO_Init(AMG_SDA_IOx, &GPIO_InitStructure);
  36.             RCC_APB2PeriphClockCmd(        AMG_SCL_RCC, ENABLE );      
  37.             GPIO_InitStructure.GPIO_Pin = AMG_SCL_PIN;               //端口配置
  38.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;       //推挽输出
  39.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //50Mhz速度
  40.             GPIO_Init(AMG_SCL_IOx, &GPIO_InitStructure);
  41.             GPIO_SetBits(AMG_SDA_IOx,AMG_SDA_PIN);//SDA输出高      
  42.             GPIO_SetBits(AMG_SCL_IOx,AMG_SCL_PIN);//SCL输出高      
  43.     }
  44.     void AMG_IIC_Start(void)
  45.     {
  46.             AMG_SDA_OUT();//sda线输出
  47.             AMG_IIC_SDA=1;                    
  48.             AMG_IIC_SCL=1;
  49.             delay_us(4);
  50.             AMG_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  51.             delay_us(4);
  52.             AMG_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  53.     }
  54.     //产生IIC停止信号
  55.     void AMG_IIC_Stop(void)
  56.     {
  57.             AMG_SDA_OUT();//sda线输出
  58.             AMG_IIC_SCL=0;
  59.             AMG_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  60.             delay_us(4);
  61.             AMG_IIC_SCL=1;
  62.             AMG_IIC_SDA=1;//发送I2C总线结束信号
  63.             delay_us(4);                                                                  
  64.     }
  65.     u8 AMG_IIC_Wait_Ack(void)
  66.     {
  67.             u8 ucErrTime=0;
  68.             AMG_SDA_IN();  //SDA设置为输入  
  69.             AMG_IIC_SDA=1;delay_us(1);         
  70.             AMG_IIC_SCL=1;delay_us(1);         
  71.             while(AMG_READ_SDA)
  72.             {
  73.                     ucErrTime++;
  74.                     if(ucErrTime>250)
  75.                     {
  76.                             AMG_IIC_Stop();
  77.                             return 1;
  78.                     }
  79.             }
  80.             AMG_IIC_SCL=0;//时钟输出0           
  81.             return 0;  
  82.     }
  83.     //产生ACK应答
  84.     void AMG_IIC_Ack(void)
  85.     {
  86.             AMG_IIC_SCL=0;
  87.             AMG_SDA_OUT();
  88.             AMG_IIC_SDA=0;
  89.             delay_us(2);
  90.             AMG_IIC_SCL=1;
  91.             delay_us(2);
  92.             AMG_IIC_SCL=0;
  93.     }
  94.     //不产生ACK应答                    
  95.     void AMG_IIC_NAck(void)
  96.     {
  97.             AMG_IIC_SCL=0;
  98.             AMG_SDA_OUT();
  99.             AMG_IIC_SDA=1;
  100.             delay_us(2);
  101.             AMG_IIC_SCL=1;
  102.             delay_us(2);
  103.             AMG_IIC_SCL=0;
  104.     }
  105.     //IIC发送一个字节
  106.     //返回从机有无应答
  107.     //1,有应答
  108.     //0,无应答                          
  109.     void AMG_IIC_Send_Byte(u8 txd)
  110.     {                        
  111.         u8 t;   
  112.             AMG_SDA_OUT();            
  113.         AMG_IIC_SCL=0;//拉低时钟开始数据传输
  114.         for(t=0;t<8;t++)
  115.         {              
  116.                     if((txd&0x80)>>7)
  117.                             AMG_IIC_SDA=1;
  118.                     else
  119.                             AMG_IIC_SDA=0;
  120.                     txd<<=1;           
  121.                     delay_us(2);  
  122.                     AMG_IIC_SCL=1;
  123.                     delay_us(2);
  124.                     AMG_IIC_SCL=0;      
  125.                     delay_us(2);
  126.         }         
  127.     }
  128.     //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  129.     u8 AMG_IIC_Read_Byte(void)
  130.     {
  131.             unsigned char i,receive=0;
  132.             AMG_SDA_IN();          //SDA设置为输入
  133.             AMG_IIC_SDA = 1;
  134.             delay_us(4);
  135.             for(i=0;i<8;i++ )
  136.             {
  137.                     receive<<=1;
  138.                     AMG_IIC_SCL=0;
  139.                     delay_us(4);
  140.                 AMG_IIC_SCL=1;
  141.                     delay_us(4);
  142.                     if(AMG_READ_SDA)
  143.                             receive |= 0x01;   
  144.                 delay_us(4); //1
  145.             }      
  146.         AMG_IIC_SCL = 0;      
  147.             return receive;
  148.     }
  149.     //IIC写一个字节数据
  150.     u8 AMG_IIC_Write_1Byte(u8 SlaveAddress, u8 REG_Address,u8 REG_data)
  151.     {
  152.             AMG_IIC_Start();
  153.             AMG_IIC_Send_Byte(SlaveAddress);
  154.             if(AMG_IIC_Wait_Ack())
  155.             {
  156.                     AMG_IIC_Stop();//释放总线
  157.                     return 1;//没应答则退出
  158.             }
  159.             AMG_IIC_Send_Byte(REG_Address);
  160.             AMG_IIC_Wait_Ack();      
  161.             delay_us(5);
  162.             AMG_IIC_Send_Byte(REG_data);
  163.             AMG_IIC_Wait_Ack();      
  164.             AMG_IIC_Stop();
  165.             return 0;
  166.     }
  167.     //IIC读一个字节数据
  168.     u8 AMG_IIC_Read_1Byte(u8 SlaveAddress, u8 REG_Address,u8 *REG_data)
  169.     {
  170.             AMG_IIC_Start();
  171.             AMG_IIC_Send_Byte(SlaveAddress);//发写命令
  172.             if(AMG_IIC_Wait_Ack())
  173.             {
  174.                      AMG_IIC_Stop();//释放总线
  175.                      return 1;//没应答则退出
  176.             }               
  177.             AMG_IIC_Send_Byte(REG_Address);
  178.             AMG_IIC_Wait_Ack();
  179.             delay_us(5);
  180.             AMG_IIC_Start();
  181.             AMG_IIC_Send_Byte(SlaveAddress|0x01);//发读命令
  182.             AMG_IIC_Wait_Ack();
  183.             *REG_data = AMG_IIC_Read_Byte();
  184.             AMG_IIC_Stop();
  185.             return 0;
  186.     }
  187.     //I2C读多个字节数据
  188.     uint8_t AMG_I2C_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
  189.     {
  190.             AMG_IIC_Start();
  191.             AMG_IIC_Send_Byte(SlaveAddress);//发写命令
  192.             if(AMG_IIC_Wait_Ack())
  193.             {
  194.                     AMG_IIC_Stop();//释放总线
  195.                     return 1;//没应答则退出
  196.             }
  197.             AMG_IIC_Send_Byte(REG_Address);
  198.             AMG_IIC_Wait_Ack();
  199.             delay_us(5);
  200.             AMG_IIC_Start();
  201.             AMG_IIC_Send_Byte(SlaveAddress|0x01);//发读命令
  202.             AMG_IIC_Wait_Ack();
  203.             while(len)
  204.             {
  205.                     *buf = AMG_IIC_Read_Byte();
  206.                     if(1 == len)
  207.                     {
  208.                             AMG_IIC_NAck();
  209.                     }
  210.                     else
  211.                     {
  212.                             AMG_IIC_Ack();
  213.                     }
  214.                     buf++;
  215.                     len--;
  216.             }
  217.             AMG_IIC_Stop();
  218.             return STATUS_OK;
  219.     }
  220.     //I2C写多个字节数据
  221.     uint8_t AMG_I2C_Write_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
  222.     {
  223.             AMG_IIC_Start();
  224.             AMG_IIC_Send_Byte(SlaveAddress);//发写命令
  225.             if(AMG_IIC_Wait_Ack())
  226.             {
  227.                     AMG_IIC_Stop();//释放总线
  228.                     return 1;//没应答则退出
  229.             }
  230.             AMG_IIC_Send_Byte(REG_Address);
  231.             AMG_IIC_Wait_Ack();
  232.             while(len--)
  233.             {
  234.                     AMG_IIC_Send_Byte(*buf++);
  235.                     AMG_IIC_Wait_Ack();
  236.             }
  237.             AMG_IIC_Stop();
  238.             return STATUS_OK;
  239.     }
  240. 3、AMG8833.h
  241.     #ifndef __AMG8833_H
  242.     #define __AMG8833_H
  243.     #include "AMG_IIC.h"
  244.     #define AMG88xx_PIXEL_TEMP_CONVERSION 0.25
  245.     #define AMG88xx_THERMISTOR_CONVERSION 0.0625
  246.     enum
  247.     {
  248.             AMG88xx_PCTL = 0x00,
  249.             AMG88xx_RST = 0x01,
  250.             AMG88xx_FPSC = 0x02,
  251.             AMG88xx_INTC = 0x03,
  252.             AMG88xx_STAT = 0x04,
  253.             AMG88xx_SCLR = 0x05,
  254.             //0x06 reserved
  255.             AMG88xx_AVE = 0x07,
  256.             AMG88xx_INTHL = 0x08,
  257.             AMG88xx_INTHH = 0x09,
  258.             AMG88xx_INTLL = 0x0A,
  259.             AMG88xx_INTLH = 0x0B,
  260.             AMG88xx_IHYSL = 0x0C,
  261.             AMG88xx_IHYSH = 0x0D,
  262.             AMG88xx_TTHL = 0x0E,
  263.             AMG88xx_TTHH = 0x0F,
  264.             AMG88xx_INT_OFFSET = 0x010,
  265.             AMG88xx_PIXEL_OFFSET = 0x80
  266.     };
  267.     enum power_modes{
  268.             AMG88xx_NORMAL_MODE = 0x00,
  269.             AMG88xx_SLEEP_MODE = 0x01,
  270.             AMG88xx_STAND_BY_60 = 0x20,
  271.             AMG88xx_STAND_BY_10 = 0x21
  272.     };
  273.     enum sw_resets {
  274.             AMG88xx_FLAG_RESET = 0x30,
  275.             AMG88xx_INITIAL_RESET = 0x3F
  276.     };
  277.     enum frame_rates {
  278.             AMG88xx_FPS_10 = 0x00,
  279.             AMG88xx_FPS_1 = 0x01
  280.     };
  281.     enum int_enables{
  282.             AMG88xx_INT_DISABLED = 0x00,
  283.             AMG88xx_INT_ENABLED = 0x01
  284.     };
  285.     enum int_modes {
  286.             AMG88xx_DIFFERENCE = 0x00,
  287.             AMG88xx_ABSOLUTE_VALUE = 0x01
  288.     };
  289.     void AMG8833_Init(void);
  290.     float AMG88xx_ReadThermistor(void);
  291.     void amg88xx_readPixels(float *buf, uint8_t size);
  292.     #endif
  293. 4、AMG8833.c
  294.     #include "AMG8833.h"
  295.     void AMG8833_Init(void)
  296.     {
  297.             AMG8833_IIC_Init();           //IIC初始化
  298.             //enter normal mode
  299.             AMG_IIC_Write_1Byte(AMG88xx_ADR,AMG88xx_PCTL,AMG88xx_NORMAL_MODE);
  300.             //software reset
  301.             AMG_IIC_Write_1Byte(AMG88xx_ADR,AMG88xx_RST,AMG88xx_INITIAL_RESET);
  302.             //set to 10 FPS
  303.             AMG_IIC_Write_1Byte(AMG88xx_ADR,AMG88xx_FPSC,AMG88xx_FPS_10);
  304.     }
  305.     float signedMag12ToFloat(uint16_t val)
  306.     {
  307.             //take first 11 bits as absolute val
  308.             uint16_t absVal = (val & 0x7FF);
  309.             return (val & 0x800) ? 0 - (float)absVal : (float)absVal ;
  310.     }
  311.     float AMG88xx_ReadThermistor(void)
  312.     {
  313.             uint8_t raw[2];
  314.             uint16_t recast;
  315.             AMG_I2C_Read_nByte(AMG88xx_ADR,AMG88xx_TTHL, raw, 2);
  316.             recast = ((uint16_t)raw[1] << 8) | ((uint16_t)raw[0]);
  317.             return signedMag12ToFloat(recast) * AMG88xx_THERMISTOR_CONVERSION;
  318.     }
  319.     void amg88xx_readPixels(float *buf, uint8_t size)
  320.     {
  321.             uint16_t recast;
  322.             float converted;
  323.             uint8_t rawArray[128],i;
  324.             AMG_I2C_Read_nByte(AMG88xx_ADR,AMG88xx_PIXEL_OFFSET,rawArray,128);
  325.             for(i=0; i<size; i++)
  326.             {
  327.                     uint8_t pos = i << 1;
  328.                     recast = ((uint16_t)rawArray[pos + 1] << 8) | ((uint16_t)rawArray[pos]);        
  329.                     converted = signedMag12ToFloat(recast) * AMG88xx_PIXEL_TEMP_CONVERSION;
  330.                     buf = converted[i];
  331.             }
  332.     }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:819036 发表于 2020-9-14 20:53 | 只看该作者
求助大佬,AMG8833引脚中的INT 和ADO在哪,我代码里只找到SCL和SDA的PB6 PB7还有VIN和GND对应的输入输出,找不到INT 和ADO在哪o(╥﹏╥)o
回复

使用道具 举报

板凳
ID:886171 发表于 2021-2-24 17:20 来自手机 | 只看该作者
int是中断脚吧  另外一个好像也不用管 我好好多amg8833应用里面这两个脚都是悬空的
回复

使用道具 举报

地板
ID:1086988 发表于 2023-7-11 10:19 | 只看该作者
INT中断脚在datasheet里面是接的VDD,ADO在datasheet里面是有两种接法。一个接0,slave address是0x68,一个接VDD,slave address是0x69。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表