61阅读

婆娑云裳-婆娑云裳,sam168.cn婆娑云裳I2C总线之TMP75温度传感器驱动程序-

发布时间:2018-05-08 所属栏目:婆娑云裳

一 : 婆娑云裳,sam168.cn婆娑云裳I2C总线之TMP75温度传感器驱动程序-

婆娑云裳,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); //

// //

//

传感器www.e900.net

二 : 婆娑云裳 怎么翻译好

婆娑云裳“犇-嫑” 怎么翻译好

婆娑云裳 怎么翻译好的参考答案

婆娑 是跳动,跳跃的意思 云裳 是轻而没的衣服 所以,翻译为 dancing clothing 比较好 你是做什么用呢?建议用英译比较妥帖,posoclothing

本文标题:婆娑云裳-婆娑云裳,sam168.cn婆娑云裳I2C总线之TMP75温度传感器驱动程序-
本文地址: http://www.61k.com/1212342.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1