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 + -
显示快捷键?