enc28j60.c
来自「spi口的超小型网络连接器」· C语言 代码 · 共 575 行 · 第 1/2 页
C
575 行
SPIWrite(&bytAddress,1); // write opcode
SPIRead(&bytData, 1); // read value
SEL_MAC(FALSE);
return bytData;
}
/***********************************************************************/
/** \brief ReadMacReg.
*
* Description: Read contents of addressed MAC register over SPI bus. Assumes correct bank selected.
*
* \author Iain Derrington
* \param bytAddress Address of register to read.
* \return byte Contens of register just read.
*/
/**********************************************************************/
static u8_t ReadMacReg(u8_t bytAddress)
{
u8_t bytData;
if (bytAddress > 0x1F)
return FALSE; // address invalid, [TO DO]
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytAddress,1); // write opcode
SPIRead(&bytData, 1); // read dummy byte
SPIRead(&bytData, 1); // read value
SEL_MAC(FALSE);
return bytData;
}
/***********************************************************************/
/** \brief Write to phy Reg.
*
* Description: Writing to PHY registers is different to writing the other regeisters in that
the registers can not be accessed directly. This function wraps up the requirements
for writing to the PHY reg. \n \n
1) Write address of phy reg to MIREGADR. \n
2) Write lower 8 bits of data to MIWRL. \n
3) Write upper 8 bits of data to MIWRL. \n \n
*
*
* \author Iain Derrington
* \param address
* \param data
* \return byte
*/
/**********************************************************************/
static u8_t WritePhyReg(u8_t address, u16_t data)
{
if (address > 0x14)
return FALSE;
BankSel(2);
WriteCtrReg(MIREGADR,address); // Write address of Phy reg
WriteCtrReg(MIWRL,(u8_t)data); // lower phy data
WriteCtrReg(MIWRH,((u8_t)(data >>8))); // Upper phydata
return TRUE;
}
/***********************************************************************/
/** \brief Read from PHY reg.
*
* Description: No direct access allowed to phy registers so the folling process must take place. \n \n
* 1) Write address of phy reg to read from into MIREGADR. \n
* 2) Set MICMD.MIIRD bit and wait 10.4uS. \n
* 3) Clear MICMD.MIIRD bit. \n
* 4) Read data from MIRDL and MIRDH reg. \n
* \author Iain Derrington
* \param address
* \return uint
*/
/**********************************************************************/
static u16_t ReadPhyReg(u8_t address)
{
volatile u16_t uiData;
volatile u8_t bytStat;
BankSel(2);
WriteCtrReg(MIREGADR,address); // Write address of phy register to read
SetBitField(MICMD, MICMD_MIIRD); // Set rd bit
do
{
bytStat = ReadMacReg(MISTAT);
}while(bytStat & MISTAT_BUSY);
ClrBitField(MICMD,MICMD_MIIRD); // Clear rd bit
uiData = (u16_t)ReadMacReg(MIRDL); // Read low data byte
uiData |=((u16_t)ReadMacReg(MIRDH)<<8); // Read high data byte
return uiData;
}
/***********************************************************************/
/** \brief Write to a control reg .
*
* Description: Writes a byte to the address register. Assumes that correct bank has
* all ready been selected
*
* \author Iain Derrington
* \param bytAddress Address of register to be written to.
* \param bytData Data to be written.
* \returns byte
*/
/**********************************************************************/
static u8_t WriteCtrReg(u8_t bytAddress,u8_t bytData)
{
if (bytAddress > 0x1f)
{
return FALSE;
}
bytAddress |= WCR_OP; // Set opcode
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytAddress,1); // Tx opcode and address
SPIWrite(&bytData,1); // Tx data
SEL_MAC(FALSE);
return TRUE;
}
/***********************************************************************/
/** \brief Read bytes from MAC data buffer.
*
* Description: Reads a number of bytes from the ENC28J60 internal memory. Assumes auto increment
* is on.
*
* \author Iain Derrington
* \param bytBuffer Buffer to place data in.
* \param byt_length Number of bytes to read.
* \return uint Number of bytes read.
*/
/**********************************************************************/
static u16_t ReadMacBuffer(u8_t * bytBuffer,u8_t byt_length)
{
u8_t bytOpcode;
volatile u16_t len;
bytOpcode = RBM_OP;
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytOpcode,1); // Tx opcode
len = SPIRead(bytBuffer, byt_length); // read bytes into buffer
SEL_MAC(FALSE); // release CS
return len;
}
/***********************************************************************/
/** \brief Write bytes to MAC data buffer.
*
* Description: Reads a number of bytes from the ENC28J60 internal memory. Assumes auto increment
* is on.
*
* \author Iain Derrington
* \param bytBuffer
* \param ui_len
* \return uint
* \date WIP
*/
/**********************************************************************/
static u16_t WriteMacBuffer(u8_t * bytBuffer,u16_t ui_len)
{
u8_t bytOpcode;
volatile u16_t len;
bytOpcode = WBM_OP;
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytOpcode,1); // Tx opcode
len = SPIWrite(bytBuffer, ui_len); // read bytes into buffer
SEL_MAC(FALSE); // release CS
return len;
}
/***********************************************************************/
/** \brief Set bit field.
*
* Description: Sets the bit/s at the address register. Assumes correct bank has been selected.
*
* \author Iain Derrington
* \param bytAddress Address of registed where bit is to be set
* \param bytData Sets all the bits high.
* \return byte True or false
*/
/**********************************************************************/
static u8_t SetBitField(u8_t bytAddress, u8_t bytData)
{
if (bytAddress > 0x1f)
{
return FALSE;
}
bytAddress |= BFS_OP; // Set opcode
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytAddress,1); // Tx opcode and address
SPIWrite(&bytData,1); // Tx data
SEL_MAC(FALSE);
return TRUE;
}
/***********************************************************************/
/** \brief Clear bit field on ctr registers.
*
* Description: Sets the bit/s at the address register. Assumes correct bank has been selected.
*
* \author Iain Derrington
* \param bytAddress Address of registed where bit is to be set
* \param bytData Sets all the bits high.
* \return byte True or false
*/
/**********************************************************************/
static u8_t ClrBitField(u8_t bytAddress, u8_t bytData)
{
if (bytAddress > 0x1f)
{
return FALSE;
}
bytAddress |= BFC_OP; // Set opcode
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytAddress,1); // Tx opcode and address
SPIWrite(&bytData,1); // Tx data
SEL_MAC(FALSE);
return TRUE;
}
/***********************************************************************/
/** \brief Bank Select.
*
* Description: Select the required bank within the ENC28J60
*
*
* \author Iain Derrington
* \param bank Value between 0 and 3.
* \date 0.1 09/06/07 First draft
*/
/**********************************************************************/
static void BankSel(u8_t bank)
{
volatile u8_t temp;
if (bank >3)
return;
temp = ReadETHReg(ECON1); // Read ECON1 register
temp &= ~ECON1_BSEL; // mask off the BSEL bits
temp |= bank; // set BSEL bits
WriteCtrReg(ECON1, temp); // write new values back to ENC28J60
}
/***********************************************************************/
/** \brief ResetMac.
*
* Description: Sends command to reset the MAC.
*
*
* \author Iain Derrington
*/
/**********************************************************************/
static void ResetMac(void)
{
u8_t bytOpcode = RESET_OP;
SEL_MAC(TRUE); // ENC CS low
SPIWrite(&bytOpcode,1); // Tx opcode and address
SEL_MAC(FALSE);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?