一 : 婆娑云裳,sam168.cn婆娑云裳I2C总线之TMP75温度传感器驱动程序-
网易博客安全提醒:系统检测到您当前密码的安全性较低,为了您的账号安全,建议您适时修改密码 立即修改 | 关闭
其实我驱动程序都是写对了的,以前没有正确接收到温度的原因,在于C语言不扎实,想传个参数过去接收I2C的温度值
,但是总会出错,接收到的数据总是0XFF,今天用了个最笨的方法,就是定义了两个全局温度变量来接收I2C的数据,结果一下子就不再是那个0XFF了,现在就把整个TMP75驱动完成了
还有测试图片 精确率选的是12bits 0.625摄氏度,还是很准确de。
(www.61k.com)补充一点就是,使用 I2CMasterSlaveAddrSet(I2C_BASE,Slave_address,I2C_w
rite);
发送从设备地址的时候,Slave_address指的是7位地址,不包含读写控制,定义宏的时候要把地址移位,如#define
TMP75_address 0x90>>1//从设备地址,这样才是对的
,开始的时候我就搞错了,这也是那几天没有调试出来的原因之一吧!
//
// I2C 总线之 TMP75 温度传感器驱动程序 //
//
// //
// 本文件包含以下函数: //
// //
// 系统时钟 初始化 //
// I2C 系统模块 初始化 //
// I2C 中断服务子程序 //
// I2C 发送 数据、命令 //
// I2C 读取 从设备数据 //
// TMP 75 初始化 【配置 控制寄存器】 //
// 转换从I2C接收到的数据为温度值 //
// TMP 75 从I2C读取温度 并转换 //
// 附录: //
// 说明 //
// //
// BY.heyong|BY.yifan //
//包含必要头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "yifan_UART_init.h"
#include "uartstdio.h"
#include "driverlib/i2c.h"
//以较短字符 宏定义 较长字符
#define ulong unsigned long
#define uchar unsigned char
//SYSCTL
#define SysCtlPeriEnable SysCtlPeripheralEnable
//GPIO
#define GPIOPinTypeInput GPIOPinTypeGPIOInput
#define GPIOPinTypeOutput GPIOPinTypeGPIOOutput
#define GPIOPinTypeI2C GPIOPinTypeI2C
//MASTER
#define I2C_CONFIG I2CMasterInitExpClk
#define I2C_SPEED_SET I2CMasterSpeedSet
#define I2C_write false
#define I2C_read true
//PERIPH
#define I2C_MODE SYSCTL_PERIPH_I2C1
#define I2C_PERI_PORT SYSCTL_PERIPH_GPIOA
//BASE
#define I2C_BASE I2C1_MASTER_BASE
#define I2C_PORT_BASE GPIO_PORTA_BASE
#define I2C_ISR INT_I2C1
//PINS
#define I2C_SCL GPIO_PIN_6
#define I2C_SDA GPIO_PIN_7
#define I2C_PINS (GPIO_PIN_6|GPIO_PIN_7)
//TMP75
#define TMP75_address
0x90>>1//从设备地址
#define TMP75_cmd_TR 0x00//Temperature Register (READ Only)
#define TMP75_cmd_CONFIG 0x01//Configuration Register
(READ/WRITE)
#define TMP75_cmd_TL 0x02//T(low) Register (READ/WRITE)
#define TMP75_cmd_TH 0x03//T(high) Register (READ/WRITE)
#define TMP75_Resolution 0.0625//Resolution(分辨率) of tmp75 is
12Bits(0.0625°C)
//TMP75_CONFIG_MODE
#define TMP75_config_data 0x6a//0x6a
//全局变量
int isr_yes_no=0;
ulong TheSysClock=UL;
//定义I2C 温度返回变量
ulong temperature0=0;
ulong temperature1=0;
//
// 系统时钟 初始化 //
//
void CLOCK_init()
{
//系统时钟设置
SysCtlClockSet(SYSCTL_USE_PLL | //打开、使能、使用锁相环PLL
SYSCTL_OSC_MAIN | //采用主振荡器
SYSCTL_XTAL_8MHZ | //外接8MHz晶振
SYSCTL_SYSDIV_4); //4分频
//获取当前的系统时钟频率
TheSysClock = SysCtlClockGet();
}
//
// I2C 系统模块 初始化 //
//
void I2C_init()
{
//使能I2C所在端口
SysCtlPeriEnable(I2C_PERI_PORT);
//使能处理器I2C功能模块
SysCtlPeriEnable(I2C_MODE);
//配置必须管脚为I2C功能(类型)
GPIOPinTypeI2C(I2C_PORT_BASE,I2C_PINS);
//配置I2C时钟及传输速率
I2C_CONFIG(I2C_BASE,SysCtlClockGet(),true);
I2CMasterEnable(I2C_BASE);
//使能所需中断
IntMasterEnable();
IntEnable(I2C_ISR);
I2CMasterIntEnable(I2C_BASE);
}
//
// I2C 中断服务子程序 //
//
void TMP75_ISR()
{
//如果中断发生,则使全局变量isr_yes_no+1,用来判断
isr_yes_no=1;
//清中断
I2CMasterIntClear(I2C_BASE);
}
//
// I2C 发送 数据、命令 //
//
// //
// 参数说明: //
// Slave_address:I2C从设备地址 //
// write_or_read:设置I2C的功能【读(I2C_read)或者写(I2C_write)】 //
// cmd :欲发送到从设备的命令 //
// send_data :欲发送到从设备的数据 //
// //
// //
// 函数返回: //
// 0: 送错误并超时 //
// 1: 发送成功 //
// //
//
ulong I2C_send_data(ulong Slave_address,ulong cmd,uchar
send_data_byte)
{
//发送从设备地址,设置I2C的功能【读(I2C_read)或者写(I2C_write)】
I2CMasterSlaveAddrSet(I2C_BASE,Slave_address,I2C_w rite);
//发送起始位 START
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_SEN
D_START);
//确认I2C主机是否忙
while(I2CMasterBusy(I2C_BASE));
//判断是否有中断发生
if(isr_yes_no!=1){
UARTprintf("IIC 发送接收温度命令失败!n");
return 0;
}
else{
UARTprintf("IIC 发送接收温度命令成功!n");
isr_yes_no=0;
}
//发送PCA9534命令到I2C的IICDS
I2CMasterDataPut(I2C_BASE,cmd);
//发送PCA9534命令到I2C总线
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_SEN D_CONT);
//确认I2C主机是否忙
while(I2CMasterBusy(I2C_BASE));
//判断是否有中断发生
if(isr_yes_no!=1){
UARTprintf("IIC 发送命令失败!n");
return 0;
}
else{
UARTprintf("IIC 发送命令成功!n");
isr_yes_no=0;
}
//发送控制数据到I2C的IICDS
I2CMasterDataPut(I2C_BASE,send_data_byte);
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_SEN
D_FINISH);
while(I2CMasterBusy(I2C_BASE));
//判断是否有中断发生
if(isr_yes_no!=1){
UARTprintf("IIC 发送控制数据失败!n");
return 0;
}
else{
UARTprintf("IIC 发送控制数据成功!n");
isr_yes_no=0;
}
//发送控制数据到I2C总线
return 1;
}
//
// I2C 读取 从设备数据 //
//
// //
// 参数说明: //
// Slave_address:I2C从设备地址 //
// cmd :欲读取从设备的地址的命令 //
// //
// //
// 函数返回: //
// 0: 读取程序执行错误并超时 //
// 1: 读取程序执行成功 //
// //
//
ulong I2C_read_data(ulong Slave_address,ulong cmd)
{
//发送从设备地址,设置I2C的功能【读(I2C_read)或者写(I2C_write)】
I2CMasterSlaveAddrSet(I2C_BASE,Slave_address,I2C_w rite);
//发送起始位 START
//发送PCA9534命令到I2C的IICDS
I2CMasterDataPut(I2C_BASE,cmd);
//发送PCA9534命令到I2C总线
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_SEN
D_START);
//确认I2C主机是否忙
while(I2CMasterBusy(I2C_BASE));
//判断是否有中断发生
if(isr_yes_no!=1){
UARTprintf("IIC 发送接收温度命令失败!n");
return 0;
}
else{
//UARTprintf("IIC 发送接收温度命令成功!n");
isr_yes_no=0;
}
//发送从设备地址,设置I2C的功能【读(I2C_read)或者写(I2C_write)】
I2CMasterSlaveAddrSet(I2C_BASE,Slave_address,I2C_r ead);
//发送控制数据到I2C总线
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_REC
EIVE_START);
//确认I2C主机是否忙
while(I2CMasterBusy(I2C_BASE));
//判断是否有中断发生
if(isr_yes_no!=1){
UARTprintf("IIC 发送接收温度命令失败!n");
return 0;
}
else{
//UARTprintf("IIC 发送接收温度命令成功!n");
isr_yes_no=0;
}
//发送控制数据到I2C的IICDS
temperature0=I2CMasterDataGet(I2C_BASE);
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_REC
EIVE_CONT);
//确认I2C主机是否忙
while(I2CMasterBusy(I2C_BASE));
//判断是否有中断发生
if(isr_yes_no!=1){
UARTprintf("IIC 接收温度数据失败!n");
return 0;
}
else{
//UARTprintf("IIC 接收温度数据成功!n");
isr_yes_no=0;
}
//发送控制数据到I2C的IICDS
temperature1=I2CMasterDataGet(I2C_BASE);
//发送控制数据到I2C总线
I2CMasterControl(I2C_BASE,I2C_MASTER_CMD_BURST_RE
婆娑云裳女装eI2C 总线之 TMP75 温度传感器驱动程序--------何勇
婆娑云裳sam168.cn
C EIVE_FINISH);//确认I2C主机是否忙
while(I2CMasterBusy(I2C_BASE));
return 1;
}
//
// TMP 75 初始化 【配置 控制寄存器】 //
//
// //
// 参数说明: //
// 无参数 //
// //
// //
// 函数返回: //
// 0: 初始化错误 //
// 1: 初始化成功 //
// //
//
ulong heyong_TMP75_init()
{
//定义I2C返回变量
ulong ret_i2c;
//配置CONFIG寄存器
ret_i2c=I2C_send_data(TMP75_address,TMP75_cmd_CONF
IG,TMP75_config_data);
if(ret_i2c==0)
return 0;
else
return 1;
}
//
// 转换从I2C接收到的数据为温度值 //
//
// //
// 参数说明: //
// 无参数 //
// //
// //
// 函数返回: //
// temperature: 返回转换完成的温度值 //
// //
//
float Temperature_val_change_hy()
{
float temperature;
temperature=(((temperature0<<4)|(temperature1>>4))&0xf
ff)*TMP75_Resolution;
return temperature;
}
//
// TMP 75 从I2C读取温度 并转换 //
//
// //
// 参数说明: //
// 无参数 //
// //
// //
// 函数返回: //
// temperature: 返回读取并转换完成的温度值(浮点型) //
// //
//
float heyong_TMP75_read_temperature()
{
float temperature;
ulong ret_i2c;
ret_i2c=I2C_read_data(TMP75_address,TMP75_cmd_TR);
if(ret_i2c==0)
return 0;
else
temperature=Temperature_val_change_hy();
return temperature;
}
//
// 说 明 //
//
// 在主函数可使用以下代码,将浮点型数据转换为char型的数组 //
// //
// float temperature; //
// uchar hy_temperature[6]; //
// temperature=heyong_TMP75_read_temperature(); //
// sprintf(hy_temperature,"%3.2f",temperature); //
// UARTprintf("TEMPERATUREL IS : %sn",hy_temperature); //
// //
//
传感器
二 : 婆娑云裳 怎么翻译好
婆娑云裳“犇-嫑” 怎么翻译好
婆娑 是跳动,跳跃的意思 云裳 是轻而没的衣服 所以,翻译为 dancing clothing 比较好 你是做什么用呢?建议用英译比较妥帖,posoclothing
本文标题:婆娑云裳-婆娑云裳,sam168.cn婆娑云裳I2C总线之TMP75温度传感器驱动程序-61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1