?? f34x_spi0_eeprom_polled_mode.c
字號:
// P2.2 - Skipped, Push-Pull, Digital (LED D4 on Target Board)
// P2.3 - Skipped, Push-Pull, Digital (LED D2 on Target Board)
// P2.4 - Unassigned, Open-Drain, Digital
// P2.5 - Unassigned, Open-Drain, Digital
// P2.6 - Unassigned, Open-Drain, Digital
// P2.7 - Unassigned, Open-Drain, Digital
// P3.0 - Unassigned, Open-Drain, Digital
// P3.1 - Unassigned, Open-Drain, Digital
// P3.2 - Unassigned, Open-Drain, Digital
// P3.3 - Unassigned, Open-Drain, Digital
// P3.4 - Unassigned, Open-Drain, Digital
// P3.5 - Unassigned, Open-Drain, Digital
// P3.6 - Unassigned, Open-Drain, Digital
// P3.7 - Unassigned, Open-Drain, Digital
//
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
P0MDOUT = 0x1D;
P2MDOUT = 0x0C;
P2SKIP = 0x0F;
XBR0 = 0x03;
XBR1 = 0x40;
}
//-----------------------------------------------------------------------------
// TIMER2_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Initializes Timer2 to be clocked by SYSCLK for use as a delay timer.
//
//-----------------------------------------------------------------------------
void TIMER2_Init (void)
{
CKCON |= 0x10;
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configures the UART0 using Timer1, for <BAUDRATE> and 8-N-1. Once this is
// set up, the standard printf function can be used to output data.
//
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1)
{
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
}
else if (SYSCLK/BAUDRATE/2/256 < 4)
{
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x09;
}
else if (SYSCLK/BAUDRATE/2/256 < 12)
{
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else
{
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// SPI0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configures SPI0 to use 4-wire Single-Master mode. The SPI timing is
// configured for Mode 0,0 (data centered on first edge of clock phase and
// SCK line low in idle state). The SPI clock is set to 2 MHz. The NSS pin
// is set to 1.
//
//-----------------------------------------------------------------------------
void SPI0_Init()
{
SPI0CFG = 0x40;
SPI0CN = 0x0D;
// The equation for SPI0CKR is (SYSCLK/(2*F_SCK_MAX))-1
SPI0CKR = (SYSCLK/(2*F_SCK_MAX)) - 1;
}
//-----------------------------------------------------------------------------
// Init_Device
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Calls all device initialization functions.
//
//-----------------------------------------------------------------------------
void Init_Device (void)
{
PCA0_Init ();
OSCILLATOR_Init ();
PORT_Init ();
TIMER2_Init ();
UART0_Init ();
SPI0_Init ();
}
//-----------------------------------------------------------------------------
// Support Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Delay_us
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : 1. time_us - time delay in microseconds
// range: 1 to 255
//
// Creates a delay for the specified time (in microseconds) using TIMER2. The
// time tolerance is approximately +/-50 ns (1/SYSCLK + function call time).
//
//-----------------------------------------------------------------------------
void Delay_us (BYTE time_us)
{
TR2 = 0; // Stop timer
TF2H = 0; // Clear timer overflow flag
TMR2 = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );
TR2 = 1; // Start timer
while (!TF2H); // Wait till timer overflow occurs
TR2 = 0; // Stop timer
}
//-----------------------------------------------------------------------------
// Delay_ms
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : 1. time_ms - time delay in milliseconds
// range: 1 to 255
//
// Creates a delay for the specified time (in milliseconds) using TIMER2. The
// time tolerance is approximately +/-50 ns (1/SYSCLK + function call time).
//
//-----------------------------------------------------------------------------
void Delay_ms (BYTE time_ms)
{
BYTE i;
while(time_ms--)
for(i = 0; i< 10; i++) // 10 * 100 microsecond delay
Delay_us (100);
}
//-----------------------------------------------------------------------------
// EEPROM_Write
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : 1. address - the destination EEPROM address.
// range: 0 to EEPROM_CAPACITY
// 2. value - the value to write.
// range: 0x00 to 0xFF
//
// Writes one byte to the specified address in the EEPROM. This function polls
// the EEPROM status register after the write operation, and returns only after
// the status register indicates that the write cycle is complete. This is to
// prevent from having to check the status register before a read operation.
//
//-----------------------------------------------------------------------------
void EEPROM_Write (UINT address, BYTE value)
{
// Writing a byte to the EEPROM is a five-step operation.
// Step1: Set the Write Enable Latch to 1
NSSMD0 = 0; // Step1.1: Activate Slave Select
SPI0DAT = EEPROM_CMD_WREN; // Step1.2: Send the WREN command
while (!SPIF); // Step1.3: Wait for end of transfer
SPIF = 0; // Step1.4: Clear the SPI intr. flag
NSSMD0 = 1; // Step1.5: Deactivate Slave Select
Delay_us (1); // Step1.6: Wait for at least
// T_NSS_DISABLE_MIN
// Step2: Send the WRITE command
NSSMD0 = 0;
SPI0DAT = EEPROM_CMD_WRITE;
while (!SPIF);
SPIF = 0;
// Step3: Send the EEPROM destination address (MSB first)
SPI0DAT = (BYTE)((address >> 8) & 0x00FF);
while (!SPIF);
SPIF = 0;
SPI0DAT = (BYTE)(address & 0x00FF);
while (!SPIF);
SPIF = 0;
// Step4: Send the value to write
SPI0DAT = value;
while (!SPIF);
SPIF = 0;
NSSMD0 = 1;
Delay_us (1);
// Step5: Poll on the Write In Progress (WIP) bit in Read Status Register
do
{
NSSMD0 = 0; // Activate Slave Select
SPI0DAT = EEPROM_CMD_RDSR; // Send the Read Status Register command
while (!SPIF); // Wait for the command to be sent out
SPIF = 0;
SPI0DAT = 0; // Dummy write to output serial clock
while (!SPIF); // Wait for the register to be read
SPIF = 0;
NSSMD0 = 1; // Deactivate Slave Select after read
Delay_us (1);
} while( (SPI0DAT & 0x01) == 0x01 );
}
//-----------------------------------------------------------------------------
// EEPROM_Read
//-----------------------------------------------------------------------------
//
// Return Value : The value that was read from the EEPROM
// range: 0x00 to 0xFF
// Parameters : 1. address - the source EEPROM address.
// range: 0 to EEPROM_CAPACITY
//
// Reads one byte from the specified EEPROM address.
//
//-----------------------------------------------------------------------------
BYTE EEPROM_Read (UINT address)
{
// Reading a byte from the EEPROM is a three-step operation.
// Step1: Send the READ command
NSSMD0 = 0; // Activate Slave Select
SPI0DAT = EEPROM_CMD_READ;
while (!SPIF);
SPIF = 0;
// Step2: Send the EEPROM source address (MSB first)
SPI0DAT = (BYTE)((address >> 8) & 0x00FF);
while (!SPIF);
SPIF = 0;
SPI0DAT = (BYTE)(address & 0x00FF);
while (!SPIF);
SPIF = 0;
// Step3: Read the value returned
SPI0DAT = 0; // Dummy write to output serial clock
while (!SPIF); // Wait for the value to be read
SPIF = 0;
NSSMD0 = 1; // Deactivate Slave Select
Delay_us (1);
return SPI0DAT;
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -