TMP101 用STM32模拟I2C的方式调通 附上代码
宏定义
#ifndef __GPIO_H__
#define __GPIO_H__
#include "stm32f10x.h"
//*****************************************************************
//i9320
#define LCD_CS_H() GPIO_SetBits(GPIOE,GPIO_Pin_2) //片选
#define LCD_CS_L() GPIO_ResetBits(GPIOE,GPIO_Pin_2)
#define LCD_RS_H() GPIO_SetBits(GPIOE,GPIO_Pin_0) //数据/命令切换
#define LCD_RS_L() GPIO_ResetBits(GPIOE,GPIO_Pin_0)
#define LCD_WR_H() GPIO_SetBits(GPIOE,GPIO_Pin_1) //写控制
#define LCD_WR_L() GPIO_ResetBits(GPIOE,GPIO_Pin_1)
#define LCD_RD_H() GPIO_SetBits(GPIOE,GPIO_Pin_4) //读控制
#define LCD_RD_L() GPIO_ResetBits(GPIOE,GPIO_Pin_4)
#define LCD_RST_H() GPIO_SetBits(GPIOE,GPIO_Pin_3) //复位
#define LCD_RST_L() GPIO_ResetBits(GPIOE,GPIO_Pin_3)
//**********************************************************************
#define TMP101_SCL_H() GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define TMP101_SCL_L() GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define TMP101_SDA_H() GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define TMP101_SDA_L() GPIO_ResetBits(GPIOA,GPIO_Pin_1)
//**********************************************************************
void GPIO_Config(void);
void GPIO_In_FLOATING_Mode(void);
//void GPIO_Out_PP_Mode(void);
//void GPIO_OutPP_Mode(void);
//void GPIO_Out_OD_Mode(void);
#endif
子函数模块
#include<gpio.h>
#include<delay.h>
void start(void)
{
// GPIO_Out_PP_Mode();
TMP101_SCL_H();
TMP101_SDA_H();
delay1us(2);
TMP101_SDA_L();
delay1us(2);
TMP101_SCL_L();
}
void master_ack(void) //yes
{
TMP101_SDA_L();
delay1us(3);
TMP101_SCL_H();
delay1us(3);
TMP101_SCL_L();
delay1us(3);
}
void stop(void)
{
TMP101_SDA_L();
delay1us(3);
TMP101_SCL_H();
delay1us(2);
TMP101_SDA_H();
}
bool answer(void)
{
u8 i=30;
TMP101_SDA_H();
delay1us(3);
TMP101_SCL_H();
delay1us(2);
while(i--)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
{
TMP101_SCL_L();
return TRUE;
}
}
TMP101_SCL_L();
return FALSE;
}
void write_onebyte(u8 data)
{
u8 i,j;
u8 temp=0x80;
for(i=0;i<8;i++)
{
j=data&temp;
if(j==0)
TMP101_SDA_L();
else
TMP101_SDA_H();
delay1us(2);
TMP101_SCL_H();
delay1us(2);
TMP101_SCL_L();
delay1us(1);
temp=temp>>1;
}
//if(answer())
// return TRUE;
//else
//return FALSE;
}
u8 read_data(void)
{
u8 i,temp;
TMP101_SDA_H();
delay1us(1);
for(i=0;i<8;i++)
{
temp=temp<<1;
TMP101_SCL_L();
delay1us(3);
TMP101_SCL_H();
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1))
{
temp=temp | 0x01;
delay1us(2);
}
else
delay1us(2);
}
TMP101_SCL_L();
return temp;
}
//*********************************************
/*自己写的
u8 read_data(void)
{
u8 i,j;
u16 temp=0x0001;
u16 temp1=0x0001;
// GPIO_IPU_Mode();
for(i=0;i<8;i++)
{
TMP101_SCL_H();
delay1us(10);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)
temp=temp|0x01;
else
temp=temp&0x01;
delay1us(10);
TMP101_SCL_L();
temp=temp<<1;
delay1us(10);
}
answer();
//TMP101_SCL_H();
delay1us(10);
for(j=0;j<8;j++)
{
TMP101_SCL_H();
delay1us(10);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)
temp1=temp1|0x01;
else
temp1=temp1&0x01;
TMP101_SCL_L();
delay1us(10);
temp1=temp1<<1;
}
return (temp<<7)|(temp1>>1) ;
}
*/
//*****************************************************************
/*
void rst_to_write(u8 s_addr) //0x92
{
start(void);
write_onebyte(0x92);
answer(void);
write_onebyte(0x01);
}
*/
u8 read_temperature()
{
bool a,b,c;
u8 temp,temp1,temp2;
start();
write_onebyte(0x92);
a=answer();
write_onebyte(0x00);
b=answer();
delay1us(3);
start();
write_onebyte(0x93);
c=answer();
temp=read_data();
master_ack();
temp1=read_data();
master_ack();
stop();
//temp2=((temp<<8)|temp1);
return temp; //取第一个寄存器中的值
}
引脚配置
#include "gpio.h"
//*******************************************************************************
// pins are used by 9320
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//void GPIO_Out_PP_Mode(void) //output mode
//{
// GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//}
//void GPIO_Out_OD_Mode(void) //input mode
//{
// GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//}
}
延时子程序
void delay1us(u16 time) //1us,还是比较精确地
{
u16 j;
while(time--)
{
for(j=9;j>0;j--);
}
}
主函数
#include<stm32f10x.h>
#include <string.h>
#include"i9320.h"
#include"delay.h"
#include"gpio.h"
#include"tmp101.h"
u8 temperature=0;
//u8 temperature1=0;
u8 num[]={'0','1','2','3','4','5','6','7','8','9'};
int main()
{
SystemInit();
delay_init(72);
GPIO_Config();
//GPIO_DQ_Out_Mode();
/* while(1)
{
DQ_L();
delay_us(5);
DQ_H();
delay_us(2);
} */
LCD_Init();
LCD_SetWindowToFullScreen();
LCD_ClearScreen(0xffff);
//LCD_test();
//LCD_SetXY(0,0);
//LCD_SetWindow(0,0,240,40);
//LCD_ClearScreen(0xf800);
//LCD_DrawPicture(0,0,image,37, 50);
//paint_part(0,0,240,16,0xf800);
//paint_part(0,304,240,320,0xf800);
//LCD_SetWindow(0,51,240,269);
//LCD_SetPoint(10,90,0x0000);
// LCD_StringLine(3,160,240,160,0x0000);
// LCD_StringLine(3,30,3,290,0x0000);
//LCD_CharDisp(220,165,0xf800,0xffff,'x');
//LCD_CharDisp(8,35,0xf800,0xffff,'y');
// LCD_CharDisp(8,165,0xf800,0xffff,'0');
//LCD_StrDisp(20,90,0xf800,0xffff,"china union" );
PutGB1616(60, 90, "现", 0xf800,0xffff);
PutGB1616(76, 90, "在", 0xf800,0xffff);
PutGB1616(92, 90, "温", 0xf800,0xffff);
PutGB1616(108, 90, "度", 0xf800,0xffff);
LCD_CharDisp(180,83,0xf800,0xffff,'o');
LCD_CharDisp(188,90,0xf800,0xffff,'C');
while(1)
{
temperature=read_temperature();
LCD_CharDisp(120,90,0xf800,0xffff,num[temperature/100]);
LCD_CharDisp(140,90,0xf800,0xffff,num[(temperature%100)/10]);
LCD_CharDisp(160,90,0xf800,0xffff,num[temperature%10]);
delay1us(2000);
}
}