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.
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable( SYSCTL_PERIPH_I2C0 );
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );
//配置相应控制端口
GPIOPinConfigure( GPIO_PB3_I2C0SDA );
GPIOPinConfigure( GPIO_PB2_I2C0SCL );
GPIOPinTypeI2CSCL( GPIO_PORTB_BASE, GPIO_PIN_2 );
GPIOPinTypeI2C( GPIO_PORTB_BASE, GPIO_PIN_3 );
//设置I2C模块传输速率,并使能主机控制功能
I2CMasterInitExpClk( I2C0_BASE, SysCtlClockGet(), false );
I2CMasterEnable( I2C0_BASE );
//
// Enable and configure the GPIO port for the LED operation.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED);
I2CMasterSlaveAddrSet( I2C0_BASE, 0x50, false);
I2CMasterDataPut( I2C0_BASE, 0x00 ); //写入主机数据(寄存器地址)
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START ); //主机数据开始传输
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
I2CMasterDataPut( I2C0_BASE, 0x06 ); //写入主机数据(寄存器内容)
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND ); //主机数据+stop传输
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
I2CMasterSlaveAddrSet( I2C0_BASE, 0x50, false); //????′?ê?·??ò?a?÷?úD′
I2CMasterDataPut( I2C0_BASE, 0x20 ); //D′è??÷?úêy?Y(êy?Y??′??÷μ??·)
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND );
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
//
// Loop Forever
//
while(1)
{
//
// Turn on the LED
//
GPIOPinWrite(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED, RED_LED);
I2CMasterSlaveAddrSet( I2C0_BASE, 0x50, true);
I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE ); //μ¥′??óê?
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
Result_H = I2CMasterDataGet( I2C0_BASE );
//
// Delay for a bit
//
SysCtlDelay(2000000);
//
// Turn on the LED
//
GPIOPinWrite(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED, BLUE_LED);
//
// Delay for a bit
//
SysCtlDelay(2000000);
}可以读其他的,就是不能读写AT24C01,好奇怪
给你个24c02的测试代码,还是觉得你器件地址的问题
This is the code that has worked for me:
MY SLAVE ADDR = 0x50
THE CODE WAS ORIGINALLY GIVEN IN SEPARATE FORUMS HERE... I HAVE JUST MODIFIED A BIT ACCORDING TO MY USE
I2C MODULE USED = I2C1
HAVE SAVED SOME DATA AND RECALLED IT BACK USING REPEATED START TECHNIQUE.
THIS CODE I HAVE TESTED WITH PA6 = SCL & PA7 = SDA AND WORKD FINE WITH 24C02
#include <stdint.h> // ift
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_i2c.h"
int i = 0;
uint8_t lcd[5]={0x99,0x88,0x77,0x66,0x54};
int main(void)
{
unsigned long data;
//
// Set the clocking to run directly from the external crystal/oscillator.
// TODO: The SYSCTL_XTAL_ value must be changed to match the value of the
// crystal on your board.
//
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
//
// The I2C1 peripheral must be enabled before use.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
//
// For this example I2C0 is used with PortB[3:2]. The actual port and
// pins used may be different on your part, consult the data sheet for
// more information. GPIO port B needs to be enabled so these pins can
// be used.
// TODO: change this to whichever GPIO port you are using.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//
// Select the I2C function for these pins. This function will also
// configure the GPIO pins pins for I2C operation, setting them to
// open-drain operation with weak pull-ups. Consult the data sheet
// to see which functions are allocated per pin.
// TODO: change this to select the port/pin you are using.
//
//GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6); // I2CSCL
GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7);
//
// Configure the pin muxing for I2C0 functions on port B2 and B3.
// This step is not necessary if your part does not support pin muxing.
// TODO: change this to select the port/pin you are using.
//
GPIOPinConfigure(GPIO_PA6_I2C1SCL);
GPIOPinConfigure(GPIO_PA7_I2C1SDA);
//
// Enable and initialize the I2C0 master module. Use the system clock for
// the I2C0 module. The last parameter sets the I2C data transfer rate.
// If false the data rate is set to 100kbps and if true the data rate will
// be set to 400kbps. For this example we will use a data rate of 100kbps.
//
I2CMasterInitExpClk(I2C1_BASE, SysCtlClockGet(), false);
//
// Tell the master module what address it will place on the bus when
// communicating with the slave. Set the address to SLAVE_ADDRESS
// (as set in the slave module). The receive parameter is set to false
// which indicates the I2C Master is initiating a writes to the slave. If
// true, that would indicate that the I2C Master is initiating reads from
// the slave.
//
while(1)
{
I2CMasterSlaveAddrSet(I2C1_BASE, 0x50, false); // The address of the Slave is 0x50
I2CMasterDataPut(I2C1_BASE, 0x10); // Addr 0x10
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
while(I2CMasterBusy(I2C1_BASE));
for (i=0;i<5;i++)
{
I2CMasterDataPut(I2C1_BASE, lcd[i]); // data to be saved at Addr 0x11 under autoincrement mode
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
while(I2CMasterBusy(I2C1_BASE));
}
//I2CMasterDataPut(I2C1_BASE, 0xee); // data to be saved at Addr 0x12 under autoincrement mode
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
while(I2CMasterBusy(I2C1_BASE));
//////// write complete/////////////////////////////////////////////////////////////////////////////////
SysCtlDelay(5500000); // writing time
///////////////////////////////////////////////////////////////
// Read at address 0x11
I2CMasterSlaveAddrSet(I2C1_BASE, 0x50, false);
I2CMasterDataPut(I2C1_BASE, 0x10); // Addr 0x11
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C1_BASE));
I2CMasterSlaveAddrSet(I2C1_BASE, 0x50, true);
data = I2CMasterDataGet(I2C1_BASE); //Receive
//I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
//
while(I2CMasterBusy(I2C1_BASE));
data = I2CMasterDataGet(I2C1_BASE); //test
for (i=0;i<4;i++)
{
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
//
while(I2CMasterBusy(I2C1_BASE));
data = I2CMasterDataGet(I2C1_BASE); //Receive
}
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
//
while(I2CMasterBusy(I2C1_BASE));
}
//return(0);
}