我学习书籍上的程序,
可是我读不到0x41的值,程序执行到if(!iRetVal)之后 直接跳转到MAP那边 ,请问这是怎么回事呢?
此外,加速度传感器的值可以读取,是硬件问题吗?
gaoyang9992006:
看不出来啊,给你个官方的例程
//***************************************************************************** // // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com///////Redistribution and use in source and binary forms, with or without//modification, are permitted provided that the following conditions//are met: // //Redistributions of source code must retain the above copyright//notice, this list of conditions and the following disclaimer. // //Redistributions in binary form must reproduce the above copyright //notice, this list of conditions and the following disclaimer in the//documentation and/or other materials provided with the//distribution. // //Neither the name of Texas Instruments Incorporated nor the names of //its contributors may be used to endorse or promote products derived //from this software without specific prior written permission. // //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR //A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT//OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,//SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT//LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, //DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY //THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT//(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE//OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //*****************************************************************************//***************************************************************************** // // Application Name- I2C// Application Overview - The objective of this application is act as an I2C//diagnostic tool. The demo application is a generic//implementation that allows the user to communicate//with any I2C device over the lines.// Application Details- // http://processors.wiki.ti.com/index.php/CC32xx_I2C_Application // or // docs\examples\CC32xx_I2C_Application.pdf // //*****************************************************************************//***************************************************************************** // //! \addtogroup i2c_demo //! @{ // //*****************************************************************************// Standard includes #include <stdio.h> #include <string.h> #include <stdlib.h>// Driverlib includes #include "hw_types.h" #include "hw_ints.h" #include "hw_memmap.h" #include "hw_common_reg.h" #include "rom.h" #include "rom_map.h" #include "interrupt.h" #include "prcm.h" #include "utils.h" #include "uart.h"// Common interface includes #include "uart_if.h" #include "i2c_if.h"#include "pinmux.h"//***************************************************************************** //MACRO DEFINITIONS //***************************************************************************** #define APPLICATION_VERSION"1.1.1" #define APP_NAME"I2C Demo" #define UART_PRINTReport #define FOREVER1 #define CONSOLEUARTA0_BASE #define FAILURE-1 #define SUCCESS0 #define RETERR_IF_TRUE(condition) {if(condition) return FAILURE;} #define RET_IF_ERR(Func){int iRetVal = (Func); \if (SUCCESS != iRetVal) \returniRetVal;}//***************************************************************************** //GLOBAL VARIABLES -- Start //***************************************************************************** #if defined(ccs) extern void (* const g_pfnVectors[])(void); #endif #if defined(ewarm) extern uVectorEntry __vector_table; #endif //***************************************************************************** //GLOBAL VARIABLES -- End //*****************************************************************************//**************************************************************************** //LOCAL FUNCTION DEFINITIONS//****************************************************************************//***************************************************************************** // //! Display a prompt for the user to enter command //! //! \paramnone //! //! \return none //!//***************************************************************************** voidDisplayPrompt() {UART_PRINT("\n\rcmd#"); }//***************************************************************************** // //! Display the usage of the I2C commands supported //! //! \paramnone //! //! \return none //!//***************************************************************************** voidDisplayUsage() {UART_PRINT("Command Usage \n\r");UART_PRINT("------------- \n\r");UART_PRINT("write <dev_addr> <wrlen> <<byte0> [<byte1> ... ]> <stop>\n\r");UART_PRINT("\t - Write data to the specified i2c device\n\r");UART_PRINT("read<dev_addr> <rdlen> \n\r\t - Read data frpm the specified ""i2c device\n\r");UART_PRINT("writereg <dev_addr> <reg_offset> <wrlen> <<byte0> [<byte1> ... ""]> \n\r");UART_PRINT("\t - Write data to the specified register of the i2c device\n\r");UART_PRINT("readreg <dev_addr> <reg_offset> <rdlen> \n\r");UART_PRINT("\t - Read data from the specified register of the i2c device\n\r");UART_PRINT("\n\r");UART_PRINT("Parameters \n\r");UART_PRINT("---------- \n\r");UART_PRINT("dev_addr - slave address of the i2c device, a hex value ""preceeded by '0x'\n\r");UART_PRINT("reg_offset - register address in the i2c device, a hex value ""preceeded by '0x'\n\r");UART_PRINT("wrlen - number of bytes to be written, a decimal value \n\r");UART_PRINT("rdlen - number of bytes to be read, a decimal value \n\r");UART_PRINT("bytex - value of the data to be written, a hex value preceeded ""by '0x'\n\r");UART_PRINT("stop - number of stop bits, 0 or 1\n\r");UART_PRINT("--------------------------------------------------------------""--------------- \n\r\n\r");}//***************************************************************************** // //! Display the buffer contents over I2C //! //! \parampucDataBuf is the pointer to the data store to be displayed //! \paramucLen is the length of the data to be displayed //! //! \return none //!//***************************************************************************** voidDisplayBuffer(unsigned char *pucDataBuf, unsigned char ucLen) {unsigned char ucBufIndx = 0;UART_PRINT("Read contents");UART_PRINT("\n\r");while(ucBufIndx < ucLen){UART_PRINT(" 0x%x, ", pucDataBuf[ucBufIndx]);ucBufIndx++;if((ucBufIndx % 8) == 0){UART_PRINT("\n\r");}}UART_PRINT("\n\r"); }//***************************************************************************** // //! Application startup display on UART //! //! \paramnone //! //! \return none //! //***************************************************************************** static void DisplayBanner(char * AppName) {Report("\n\n\n\r");Report("\t\t *************************************************\n\r");Report("\t\tCC3200 %s Application\n\r", AppName);Report("\t\t *************************************************\n\r");Report("\n\n\n\r"); }//**************************************************************************** // //! Parses the read command parameters and invokes the I2C APIs //! //! \param pcInpString pointer to the user command parameters //!//! This function//!1. Parses the read command parameters. //!2. Invokes the corresponding I2C APIs //! //! \return 0: Success, < 0: Failure. // //**************************************************************************** int ProcessReadCommand(char *pcInpString) {unsigned char ucDevAddr, ucLen;unsigned char aucDataBuf[256];char *pcErrPtr;int iRetVal;//// Get the device address//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucDevAddr = (unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);//// Get the length of data to be read//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucLen = (unsigned char)strtoul(pcInpString, &pcErrPtr, 10);//RETERR_IF_TRUE(ucLen > sizeof(aucDataBuf));//// Read the specified length of data//iRetVal = I2C_IF_Read(ucDevAddr, aucDataBuf, ucLen);if(iRetVal == SUCCESS){UART_PRINT("I2C Read complete\n\r");//// Display the buffer over UART on successful write//DisplayBuffer(aucDataBuf, ucLen);}else{UART_PRINT("I2C Read failed\n\r");return FAILURE;}return SUCCESS; }//**************************************************************************** // //! Parses the readreg command parameters and invokes the I2C APIs //! i2c readreg 0x<dev_addr> 0x<reg_offset> <rdlen> //! //! \param pcInpString pointer to the readreg command parameters //!//! This function//!1. Parses the readreg command parameters. //!2. Invokes the corresponding I2C APIs //! //! \return 0: Success, < 0: Failure. // //**************************************************************************** int ProcessReadRegCommand(char *pcInpString) {unsigned char ucDevAddr, ucRegOffset, ucRdLen;unsigned char aucRdDataBuf[256];char *pcErrPtr;//// Get the device address//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucDevAddr = (unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);//// Get the register offset address//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucRegOffset = (unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);//// Get the length of data to be read//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucRdLen = (unsigned char)strtoul(pcInpString, &pcErrPtr, 10);//RETERR_IF_TRUE(ucLen > sizeof(aucDataBuf));//// Write the register address to be read from.// Stop bit implicitly assumed to be 0.//RET_IF_ERR(I2C_IF_Write(ucDevAddr,&ucRegOffset,1,0));//// Read the specified length of data//RET_IF_ERR(I2C_IF_Read(ucDevAddr, &aucRdDataBuf[0], ucRdLen));UART_PRINT("I2C Read From address complete\n\r");//// Display the buffer over UART on successful readreg//DisplayBuffer(aucRdDataBuf, ucRdLen);return SUCCESS; }//**************************************************************************** // //! Parses the writereg command parameters and invokes the I2C APIs //! i2c writereg 0x<dev_addr> 0x<reg_offset> <wrlen> <0x<byte0> [0x<byte1> ...]> //! //! \param pcInpString pointer to the readreg command parameters //!//! This function//!1. Parses the writereg command parameters. //!2. Invokes the corresponding I2C APIs //! //! \return 0: Success, < 0: Failure. // //**************************************************************************** int ProcessWriteRegCommand(char *pcInpString) {unsigned char ucDevAddr, ucRegOffset, ucWrLen;unsigned char aucDataBuf[256];char *pcErrPtr;int iLoopCnt = 0;//// Get the device address//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucDevAddr = (unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);//// Get the register offset to be written//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucRegOffset = (unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);aucDataBuf[iLoopCnt] = ucRegOffset;iLoopCnt++;//// Get the length of data to be written//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucWrLen = (unsigned char)strtoul(pcInpString, &pcErrPtr, 10);//RETERR_IF_TRUE(ucWrLen > sizeof(aucDataBuf));//// Get the bytes to be written//for(; iLoopCnt < ucWrLen + 1; iLoopCnt++){//// Store the data to be written//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);aucDataBuf[iLoopCnt] =(unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);}//// Write the data values.//RET_IF_ERR(I2C_IF_Write(ucDevAddr,&aucDataBuf[0],ucWrLen+1,1));UART_PRINT("I2C Write To address complete\n\r");return SUCCESS; }//**************************************************************************** // //! Parses the write command parameters and invokes the I2C APIs //! //! \param pcInpString pointer to the write command parameters //!//! This function//!1. Parses the write command parameters. //!2. Invokes the corresponding I2C APIs //! //! \return 0: Success, < 0: Failure. // //**************************************************************************** int ProcessWriteCommand(char *pcInpString) {unsigned char ucDevAddr, ucStopBit, ucLen;unsigned char aucDataBuf[256];char *pcErrPtr;int iRetVal, iLoopCnt;//// Get the device address//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucDevAddr = (unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);//// Get the length of data to be written//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucLen = (unsigned char)strtoul(pcInpString, &pcErrPtr, 10);//RETERR_IF_TRUE(ucLen > sizeof(aucDataBuf));for(iLoopCnt = 0; iLoopCnt < ucLen; iLoopCnt++){//// Store the data to be written//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);aucDataBuf[iLoopCnt] =(unsigned char)strtoul(pcInpString+2, &pcErrPtr, 16);}//// Get the stop bit//pcInpString = strtok(NULL, " ");RETERR_IF_TRUE(pcInpString == NULL);ucStopBit = (unsigned char)strtoul(pcInpString, &pcErrPtr, 10);//// Write the data to the specified address//iRetVal = I2C_IF_Write(ucDevAddr, aucDataBuf, ucLen, ucStopBit);if(iRetVal == SUCCESS){UART_PRINT("I2C Write complete\n\r");}else{UART_PRINT("I2C Write failed\n\r");return FAILURE;}return SUCCESS; }//**************************************************************************** // //! Parses the user input command and invokes the I2C APIs //! //! \param pcCmdBuffer pointer to the user command //!//! This function//!1. Parses the user command. //!2. Invokes the corresponding I2C APIs //! //! \return 0: Success, < 0: Failure. // //**************************************************************************** int ParseNProcessCmd(char *pcCmdBuffer) {char *pcInpString;int iRetVal = FAILURE;pcInpString = strtok(pcCmdBuffer, " \n\r");if(pcInpString != NULL){if(!strcmp(pcInpString, "read")){//// Invoke the read command handler//iRetVal = ProcessReadCommand(pcInpString);}else if(!strcmp(pcInpString, "readreg")){//// Invoke the readreg command handler//iRetVal = ProcessReadRegCommand(pcInpString);}else if(!strcmp(pcInpString, "writereg")){//// Invoke the writereg command handler//iRetVal = ProcessWriteRegCommand(pcInpString);}else if(!strcmp(pcInpString, "write")){//// Invoke the write command handler//iRetVal = ProcessWriteCommand(pcInpString);}else{UART_PRINT("Unsupported command\n\r");return FAILURE;}}return iRetVal; }//***************************************************************************** // //! Board Initialization & Configuration //! //! \paramNone //! //! \return None // //***************************************************************************** static void BoardInit(void) { /* In case of TI-RTOS vector table is initialize by OS itself */ #ifndef USE_TIRTOS//// Set vector table base// #if defined(ccs)MAP_IntVTableBaseSet((unsigned long)&g_pfnVectors[0]); #endif #if defined(ewarm)MAP_IntVTableBaseSet((unsigned long)&__vector_table); #endif #endif//// Enable Processor//MAP_IntMasterEnable();MAP_IntEnable(FAULT_SYSTICK);PRCMCC3200MCUInit(); }//***************************************************************************** // //! Main function handling the I2C example //! //! \paramNone //! //! \return None //!//***************************************************************************** void main() {int iRetVal;char acCmdStore[512];//// Initialize board configurations//BoardInit();//// Configure the pinmux settings for the peripherals exercised//PinMuxConfig();//// Configuring UART//InitTerm();//// I2C Init//I2C_IF_Open(I2C_MASTER_MODE_FST);//// Display the banner followed by the usage description//DisplayBanner(APP_NAME);DisplayUsage();while(FOREVER){//// Provide a prompt for the user to enter a command//DisplayPrompt();//// Get the user command line//iRetVal = GetCmd(acCmdStore, sizeof(acCmdStore));if(iRetVal < 0){//// Error in parsing the command as length is exceeded.//UART_PRINT("Command length exceeded 512 bytes \n\r");DisplayUsage();}else if(iRetVal == 0){//// No input. Just an enter pressed probably. Display a prompt.//}else{//// Parse the user command and try to process it.//iRetVal = ParseNProcessCmd(acCmdStore);if(iRetVal < 0){UART_PRINT("Error in processing command\n\r");DisplayUsage();}}} }//***************************************************************************** // // Close the Doxygen group. //! @ // //*****************************************************************************
weiyang zhou:
回复 gaoyang9992006:
这个官方例程我也有哦,应该不是I2C出问题了,毕竟加速度传感器可以工作, 可以想想也不可能就坏以个温度传感器啊
TI中文支持网
