📄 i2c_atmel.c
字号:
g_ulState = STATE_READ_NEXT;
//
// This state is done.
//
break;
}
//
// The state for the middle of a burst read.
//
case STATE_READ_NEXT:
{
//
// Read the received character.
//
*g_pucData++ = I2CMasterDataGet(I2C0_MASTER_BASE);
g_ulCount--;
//
// Continue the burst read.
//
I2CMasterControl(I2C0_MASTER_BASE,
I2C_MASTER_CMD_BURST_RECEIVE_CONT);
//
// If there are two characters left to be read, make the next
// state be the end of burst read state.
//
if(g_ulCount == 2)
{
g_ulState = STATE_READ_FINAL;
}
//
// This state is done.
//
break;
}
//
// The state for the end of a burst read.
//
case STATE_READ_FINAL:
{
//
// Read the received character.
//
*g_pucData++ = I2CMasterDataGet(I2C0_MASTER_BASE);
g_ulCount--;
//
// Finish the burst read.
//
I2CMasterControl(I2C0_MASTER_BASE,
I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
//
// The next state is the wait for final read state.
//
g_ulState = STATE_READ_WAIT;
//
// This state is done.
//
break;
}
//
// This state is for the final read of a single or burst read.
//
case STATE_READ_WAIT:
{
//
// Read the received character.
//
*g_pucData++ = I2CMasterDataGet(I2C0_MASTER_BASE);
g_ulCount--;
//
// The state machine is now idle.
//
g_ulState = STATE_IDLE;
//
// This state is done.
//
break;
}
}
}
//*****************************************************************************
//
// Write to the Atmel device.
//
//*****************************************************************************
void
AtmelWrite(unsigned char *pucData, unsigned long ulOffset,
unsigned long ulCount)
{
//
// Save the data buffer to be written.
//
g_pucData = pucData;
g_ulCount = ulCount;
//
// Set the next state of the interrupt state machine based on the number of
// bytes to write.
//
if(ulCount != 1)
{
g_ulState = STATE_WRITE_NEXT;
}
else
{
g_ulState = STATE_WRITE_FINAL;
}
//
// Set the slave address and setup for a transmit operation.
//
I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, 0x50 | (ulOffset >> 8), false);
//
// Place the address to be written in the data register.
//
I2CMasterDataPut(I2C0_MASTER_BASE, ulOffset);
//
// Start the burst cycle, writing the address as the first byte.
//
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);
//
// Wait until the I2C interrupt state machine is idle.
//
while(g_ulState != STATE_IDLE)
{
}
}
//*****************************************************************************
//
// Read from the Atmel device.
//
//*****************************************************************************
void
AtmelRead(unsigned char *pucData, unsigned long ulOffset,
unsigned long ulCount)
{
//
// Save the data buffer to be read.
//
g_pucData = pucData;
g_ulCount = ulCount;
//
// Set the next state of the interrupt state machine based on the number of
// bytes to read.
//
if(ulCount == 1)
{
g_ulState = STATE_READ_ONE;
}
else
{
g_ulState = STATE_READ_FIRST;
}
//
// Start with a dummy write to get the address set in the EEPROM.
//
I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, 0x50 | (ulOffset >> 8), false);
//
// Place the address to be written in the data register.
//
I2CMasterDataPut(I2C0_MASTER_BASE, ulOffset);
//
// Perform a single send, writing the address as the only byte.
//
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND);
//
// Wait until the I2C interrupt state machine is idle.
//
while(g_ulState != STATE_IDLE)
{
}
}
//*****************************************************************************
//
// This example demonstrates the use of the I2C block to connect to an Atmel
// AT24C08A EEPROM.
//
//*****************************************************************************
int
main(void)
{
unsigned char pucData[16];
unsigned long ulIdx;
//
// Set the clocking to run directly from the crystal.
//
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
//
// Init the PDC and the LCD.
//
PDCInit();
PDCLCDInit();
PDCLCDBacklightOn();
//
// Enable the peripherals used by this example.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//
// Indicate that the I2C example is running.
//
PDCLCDSetPos(0, 0);
PDCLCDWrite("I2C running...", 14);
//
// Enable processor interrupts.
//
IntMasterEnable();
//
// Configure the appropriate pins to be I2C instead of GPIO.
//
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
//
// Initialize the I2C master.
//
I2CMasterInitExpClk(I2C0_MASTER_BASE, SysCtlClockGet(), false);
//
// Enable the I2C interrupt.
//
IntEnable(INT_I2C0);
//
// Enable the I2C master interrupt.
//
I2CMasterIntEnable(I2C0_MASTER_BASE);
//
// Write a data=address pattern into the first 16 bytes of the Atmel
// device.
//
for(ulIdx = 0; ulIdx < 16; ulIdx++)
{
pucData[ulIdx] = ulIdx;
}
AtmelWrite(pucData, 0, 16);
//
// Read back the first 16 bytes of the Atmel device and verify that it
// contains the data it should.
//
AtmelRead(pucData, 0, 16);
for(ulIdx = 0; ulIdx < 16; ulIdx++)
{
if(pucData[ulIdx] != ulIdx)
{
PDCLCDSetPos(0, 1);
PDCLCDWrite("Data error.", 11);
DiagExit(0);
}
}
//
// Success.
//
PDCLCDSetPos(0, 1);
PDCLCDWrite("Success.", 8);
//
// Exit.
//
DiagExit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -