This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

写的TM4C129——I2C没反应,麻烦帮忙看看问题在哪里

#include <stdint.h>
#include <stdbool.h>
#include "hw_memmap.h"
#include "hw_i2c.h"
#include "hw_gpio.h"
#include "sysctl.h"
#include "systemInit.h"
#include "i2c.h"
#include "gpio.h"
#include "pin_map.h"
#include "IIC.h"
/*-----------------------------------------------------------------------------
IIC引脚
SCL-->GPIO_PB2
SDA-->GPIO_PB3
------------------------------------------------------------------------------*/
/**************************实现函数********************************************
*函数原型: void IIC_Init(void)
*功  能: 初始化I2C对应的接口引脚。
*******************************************************************************/
void IIC_INIT(void)
{
//配置I2C0使能
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
//使能GPIOB
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPadConfigSet(GPIO_PORTB_BASE, GPIO_PIN_2| GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
//配置复用功能为IIC
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
//配置PB2为scl,PB3为sda
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2|GPIO_PIN_3);
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
//初始化主从
I2CMasterInitExpClk(I2C0_BASE, TheSysClock, true);
I2CMasterEnable(I2C0_BASE);
}
/**************************实现函数********************************************
*函数原型: uint8_t IICreadBytes(uint8_t DevAddr, uint8_t RegAddr, uint8_t WriteNum, uint8_t * ReadTemp)
*功  能: 读取指定设备 指定寄存器的 length个值
输入 dev 目标设备地址
reg 寄存器地址
length 要读的字节数
*data 读出的数据将要存放的指针
*返 回: I2C_MASTER_ERR_NONE
I2C_MASTER_ERR_ADDR_ACK,
I2C_MASTER_ERR_DATA_ACK
I2C_MASTER_ERR_ARB_LOST中的一个
*******************************************************************************/
uint8_t IICreadBytes(uint8_t DevAddr, uint8_t RegAddr, uint8_t WriteNum, uint8_t * ReadTemp)
{
uint8_t i;
uint8_t rop;
//指定从设备地址
I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
//发送寄存器地址
I2CMasterDataPut(I2C0_BASE, RegAddr);
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusBusy(I2C0_BASE));
I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, true);
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_BURST_RECEIVE_START);
for(i = 0; i < WriteNum; i++)
{
//读数据
while(I2CMasterBusBusy(I2C0_BASE));
ReadTemp[i] = I2CMasterDataGet(I2C0_BASE);
if(i==(WriteNum-1))
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
else
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_BURST_RECEIVE_CONT);
}
//完成传输前等待
while(I2CMasterBusBusy(I2C0_BASE));
//检测I2C传输是否错误
rop = I2CMasterErr(I2C0_BASE);

return rop;
}
/**************************实现函数********************************************
*函数原型: unsigned char I2C_ReadOneByte(uint8_t DevAddr, uint8_t RegAddr)
*功  能: 读取指定设备 指定寄存器的一个值
输入 I2C_Addr 目标设备地址
addr 寄存器地址
*返 回: 读出来的值
*******************************************************************************/
unsigned char I2C_ReadOneByte(uint8_t DevAddr, uint8_t RegAddr)
{
uint8_t value;
//指定从设备地址 读
I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
//发送寄存器地址
I2CMasterDataPut(I2C0_BASE, RegAddr);
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusBusy(I2C0_BASE));
//接受从设备发送的数据
I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, true);
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE );
while(I2CMasterBusBusy(I2C0_BASE));
value=I2CMasterDataGet(I2C0_BASE);
return value;
}

/**************************实现函数********************************************
*函数原型: uint8_t IICwriteBytes(uint8_t DevAddr, uint8_t RegAddr, uint8_t WriteNum, uint8_t * WriteTemp)
*功  能: 将多个字节写入指定设备 指定寄存器,发送多个字节数据
输入 dev 目标设备地址
reg 寄存器地址
length 要写的字节数
*data 将要写的数据的首地址
*返 回: 返回是否成功
*******************************************************************************/
uint8_t IICwriteBytes(uint8_t DevAddr, uint8_t RegAddr, uint8_t WriteNum, uint8_t * WriteTemp)
{
uint8_t i;
uint8_t rop;
//指定从设备地址 写
I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
I2CMasterDataPut(I2C0_BASE, RegAddr);
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusBusy(I2C0_BASE));
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_FIFO_BURST_SEND_START);
for(i=0; i < WriteNum; i++)
{
while(I2CMasterBusBusy(I2C0_BASE));
I2CMasterDataPut(I2C0_BASE, WriteTemp[i]);
if(i==(WriteNum-1))
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
else
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);
}
//完成传输前等待
while(I2CMasterBusBusy(I2C0_BASE));
//检测I2C传输是否错误
rop = I2CMasterErr(I2C0_BASE);

return rop;
}
/**************************实现函数********************************************
*函数原型: uint8_t IICreadByte(u8 dev, u8 reg, u8 *data)
*功  能: 读取指定设备 指定寄存器的一个值
输入 dev 目标设备地址
reg 寄存器地址
*data 读出的数据将要存放的地址
*返 回: 1
*******************************************************************************/
uint8_t IICreadByte(uint8_t dev, uint8_t reg, uint8_t *data)
{
*data=I2C_ReadOneByte(dev, reg);
return 1;
}

/**************************实现函数********************************************
*函数原型: uint8_t IICwriteByte(uint8_t DevAddr, uint8_t RegAddr, uint8_t WriteData)
*功  能: 写入指定设备 指定寄存器一个字节,IIC写单字节
输入 dev 目标设备地址
reg 寄存器地址
data 将要写入的字节
*返 回: I2C_MASTER_ERR_NONE
I2C_MASTER_ERR_ADDR_ACK,
I2C_MASTER_ERR_DATA_ACK
I2C_MASTER_ERR_ARB_LOST错误状态中的一个
*******************************************************************************/

uint8_t IICwriteByte(uint8_t DevAddr, uint8_t RegAddr, uint8_t WriteData)
{
uint8_t rop;
//指定从设备地址 写
I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
//将要发送的地址发送到缓冲区
I2CMasterDataPut(I2C0_BASE, RegAddr);
// 开始向从设备发送地址
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
//完成传输前等待
while(I2CMasterBusBusy(I2C0_BASE));
//将要发送给从设备的数据发送到缓冲区
I2CMasterDataPut(I2C0_BASE, WriteData);
// 开始向从设备发送数据
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
//完成传输前等待
while(I2CMasterBusBusy(I2C0_BASE));
//检测I2C传输是否错误
rop = I2CMasterErr(I2C0_BASE);
return rop;
}
/**************************实现函数********************************************
*函数原型: uint8_t IICwriteBits(uint8_t dev,uint8_t reg,uint8_t bitStart,uint8_t length,uint8_t data)
*功  能: 读 修改 写 指定设备 指定寄存器一个字节 中的多个位
输入 dev 目标设备地址
reg 寄存器地址
bitStart 目标字节的起始位
length 位长度
data 存放改变目标字节位的值
*返 回: 成功 为1
失败 为0
*******************************************************************************/
void IICwriteBits(uint8_t dev,uint8_t reg,uint8_t bitStart,uint8_t length,uint8_t data)
{

uint8_t b,mask;
IICreadBytes(dev, reg, 1, &b);
mask = (0xFF << (bitStart + 1)) | 0xFF >> ((8 - bitStart) + length - 1);
data <<= (8 - length);
data >>= (7 - bitStart);
b &= mask;
b |= data;
IICwriteByte(dev, reg, b);
}
/**************************实现函数********************************************
*函数原型: uint8_t IICwriteBit(uint8_t dev, uint8_t reg, uint8_t bitNum, uint8_t data)
*功  能: 读 修改 写 指定设备 指定寄存器一个字节 中的1个位
输入 dev 目标设备地址
reg 寄存器地址
bitNum 要修改目标字节的bitNum位
data 为0 时,目标位将被清0 否则将被置位
*返 回: 成功 为1
失败 为0
*******************************************************************************/
void IICwriteBit(uint8_t dev, uint8_t reg, uint8_t bitNum, uint8_t data)
{
uint8_t b;
IICreadBytes(dev, reg, 1, &b);
b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
IICwriteByte(dev, reg, b);
}