LM3S_lm75a.rar

  • 程序员琪
    了解作者
  • C/C++
    开发工具
  • 3KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 11
    下载次数
  • 2012-03-23 16:46
    上传日期
LM3S系列通过IIC读取LM75的参考程序。
LM3S_lm75a.rar
  • os_iic.c
    7.5KB
  • lm75a.h
    265B
  • lm75a.c
    1.4KB
  • os_iic.h
    622B
内容介绍
#define __OS_IIC_C__ #include "usrmain.h" #include "hw_inc/hw_i2c.h" #include "lib_inc/i2c.h" //////////////////////////////////////////////////////////////////////////////// static struct { OS_EVENT *pMutexSem; OS_EVENT *pRestSem; unsigned short IsRead; unsigned short Datalen; unsigned char *pReadData; const unsigned char *pWriteData; }iic_cb; #define IIC_WAIT_TIME 1000 static void IIC0_IntHandler(void); //////////////////////////////////////////////////////////////////////////////// // // 函数名称:IIC0_Init() // // 函数功能: // // 输入参数: // // 输出参数: // // 依赖模块: // 备 注: // //////////////////////////////////////////////////////////////////////////////// BOOL IIC0_Init(unsigned fiic) { iic_cb.pRestSem = OSSemCreate(0); if(!iic_cb.pRestSem) return FALSE; iic_cb.pMutexSem = OSSemCreate(1); if(!iic_cb.pMutexSem) return FALSE; SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2|GPIO_PIN_3); I2CMasterEnable(I2C0_MASTER_BASE); // TPR = SysClock/(20*I2cClock)-1; HWREG(I2C0_MASTER_BASE + I2C_O_MTPR) = SysCtlClockGet()/(20*fiic); I2CIntRegister(I2C0_MASTER_BASE, IIC0_IntHandler); return TRUE; } //////////////////////////////////////////////////////////////////////////////// // 开始IIC总线的写操作,有起始位、设备地址、数据,但不包含停止位。 //////////////////////////////////////////////////////////////////////////////// static unsigned _iic0_write_nostop( unsigned char hwaddr, unsigned datlen, const unsigned char *pdat) { INT8U err; OSSemSet(iic_cb.pRestSem, 0, &err); // TODO ... iic_cb.IsRead = FALSE; hwaddr &= 0xfe; iic_cb.Datalen = datlen; iic_cb.pWriteData = pdat; // Start iic. I2CMasterIntClear(I2C0_MASTER_BASE); HWREG(I2C0_MASTER_BASE + I2C_O_MSA) = hwaddr; I2CMasterDataPut(I2C0_MASTER_BASE, *pdat); I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_SEND_START); I2CMasterIntEnable(I2C0_MASTER_BASE); // Wait for iic end. OSSemPend(iic_cb.pRestSem, IIC_WAIT_TIME*OS_TICKS_PER_SEC/1000, &err); // 返回已经发送到IIC总线的字节数。 return datlen - iic_cb.Datalen; } //////////////////////////////////////////////////////////////////////////////// // // 函数名称:IIC0_Write() // // 函数功能:向IICO总线写入给定的字节流,并返回成功写入的字节数。 // // 输入参数:hwaddr 硬件地址,其bit0总是为0,用于R/W标志。 // datlen 需要写入的数据字节数,包括扩展地址。 // pdat 写入的字节流,包括扩展地址和数据流。 // 输出参数:返回成功写入的数据字节数,其最大值为[datlen]参数。 // // 依赖模块: // 备 注: // //////////////////////////////////////////////////////////////////////////////// unsigned IIC0_Write( unsigned char hwaddr, unsigned datlen, const unsigned char *pdat) { INT8U err; if(datlen == 0) return 0; OSSemPend(iic_cb.pMutexSem, 0, &err); if(I2CMasterBusBusy(I2C0_MASTER_BASE)){ OSSemPost(iic_cb.pMutexSem); return 0; } datlen = _iic0_write_nostop(hwaddr, datlen, pdat); I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_SEND_ERROR_STOP); OSSemPost(iic_cb.pMutexSem); return datlen; } //////////////////////////////////////////////////////////////////////////////// // // 函数名称:IIC0_Write() // // 函数功能:从IICO总线读出若干字节,并返回成功读取的字节数。 // // 输入参数:hwaddr 硬件地址,其bit0总是为0,用于R/W标志。 // exaddrlen 某IIC总线设备的扩展地址的字节数。 // exaddr 扩展地址的内存缓冲区。 // datlen 需要读取的数据字节数,不包括扩展地址。 // pdat 缓冲区地址,存储读取数据流。 // 输出参数:返回成功读取的数据字节数,其最大值为[datlen]参数。 // // 依赖模块: // 备 注: // //////////////////////////////////////////////////////////////////////////////// unsigned IIC0_Read( unsigned char hwaddr, unsigned exaddrlen, const unsigned char *exaddr, unsigned datlen, unsigned char *pdat) { INT8U err; if(datlen == 0) return 0; OSSemPend(iic_cb.pMutexSem, 0, &err); if(I2CMasterBusBusy(I2C0_MASTER_BASE)){ OSSemPost(iic_cb.pMutexSem); return 0; } if(exaddrlen > 0 && exaddr != NULL){ if(exaddrlen != _iic0_write_nostop(hwaddr, exaddrlen, exaddr)){ I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_SEND_ERROR_STOP); OSSemPost(iic_cb.pMutexSem); return 0; } } OSSemSet(iic_cb.pRestSem, 0, &err); // TODO ... iic_cb.IsRead = TRUE; hwaddr |= 0x01; iic_cb.Datalen = datlen; iic_cb.pReadData = pdat; // Start iic. I2CMasterIntClear(I2C0_MASTER_BASE); HWREG(I2C0_MASTER_BASE + I2C_O_MSA) = hwaddr; if(datlen == 1){ I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_SINGLE_RECEIVE); }else{ I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_RECEIVE_START); } I2CMasterIntEnable(I2C0_MASTER_BASE); // Wait for iic end. OSSemPend(iic_cb.pRestSem, IIC_WAIT_TIME*OS_TICKS_PER_SEC/1000, &err); // 计算出从IIC总线成功读取的字节数。 datlen = datlen - iic_cb.Datalen; OSSemPost(iic_cb.pMutexSem); return datlen; } //////////////////////////////////////////////////////////////////////////////// // // 函数名称:IIC0_IntHandler() // // 函数功能: // // 输入参数: // // 输出参数: // // 依赖模块: // 备 注: // //////////////////////////////////////////////////////////////////////////////// static void IIC0_IntHandler(void) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif unsigned long errcode; I2CMasterIntClear(I2C0_MASTER_BASE); errcode = I2CMasterErr(I2C0_MASTER_BASE); if(FALSE == iic_cb.IsRead){ // IIC WRITE. if(I2C_MASTER_ERR_NONE == errcode){ iic_cb.Datalen--; iic_cb.pWriteData++; if(iic_cb.Datalen > 0){ I2CMasterDataPut(I2C0_MASTER_BASE, *iic_cb.pWriteData); I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_SEND_CONT); return; } } }else{ // IIC READ. if(I2C_MASTER_ERR_NONE == errcode){ *iic_cb.pReadData++ = I2CMasterDataGet(I2C0_MASTER_BASE); iic_cb.Datalen--; if(iic_cb.Datalen > 0){ if(iic_cb.Datalen == 1){ I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_RECEIVE_FINISH); }else{ I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_RECEIVE_CONT); } return; } }else{ I2CMasterControl(I2C0_MASTER_BASE, \ I2C_MASTER_CMD_BURST_SEND_ERROR_STOP); } } OS_ENTER_CRITICAL(); OSIntNesting++; OS_EXIT_CRITICAL(); OSSemPost(iic_cb.pRestSem); I2CMasterIntDisable(I2C0_MASTER_BASE); OSIntExit(); }
评论
    相关推荐
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      数据库课程设计十分完整有需要的请下载啊谢谢
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...