|
|
/* ###################################################################
|
|
|
** This component module is generated by Processor Expert. Do not modify it.
|
|
|
** Filename : McuOneWire.h
|
|
|
** CDE edition : Community
|
|
|
** Project : FRDM-K64F_Generator
|
|
|
** Processor : MK64FN1M0VLL12
|
|
|
** Component : OneWire
|
|
|
** Version : Component 01.154, Driver 01.00, CPU db: 3.00.000
|
|
|
** Compiler : GNU C Compiler
|
|
|
** Date/Time : 2020-10-13, 06:28, # CodeGen: 701
|
|
|
** Abstract :
|
|
|
** This is a component implementing the 1-Wire protocol.
|
|
|
** Settings :
|
|
|
** Component Name : McuOneWire
|
|
|
** Data Pin I/O : SDK_BitIO
|
|
|
** Write Pin : Disabled
|
|
|
** Timing :
|
|
|
** A: Write 1 Low time (us) : 6
|
|
|
** B: Write 1 High time (us) : 64
|
|
|
** C: Write 0 Low time (us) : 60
|
|
|
** D: Write 0 High time (us) : 10
|
|
|
** E: Read delay time (us) : 3
|
|
|
** A: Read Low time (us) : 6
|
|
|
** F: Read delay time : 55
|
|
|
** H: Reset low time (us) : 480
|
|
|
** I: Reset response time (us) : 70
|
|
|
** J: Reset wait time after reading device presence (us) : 410
|
|
|
** Total slot time (us) : 100
|
|
|
** Buffers :
|
|
|
** Input : RBInput
|
|
|
** Debug : Enabled
|
|
|
** Debug Read Pin : SDK_BitIO
|
|
|
** CriticalSection : McuCriticalSection
|
|
|
** Utility : McuUtility
|
|
|
** Wait : McuWait
|
|
|
** SDK : McuLib
|
|
|
** RTOS : Enabled
|
|
|
** RTOS : McuRTOS
|
|
|
** Shell : Enabled
|
|
|
** Shell : McuShell
|
|
|
** Contents :
|
|
|
** CalcCRC - uint8_t McuOneWire_CalcCRC(uint8_t *data, uint8_t dataSize);
|
|
|
** SendByte - uint8_t McuOneWire_SendByte(uint8_t data);
|
|
|
** SendBytes - uint8_t McuOneWire_SendBytes(uint8_t *data, uint8_t count);
|
|
|
** Receive - uint8_t McuOneWire_Receive(uint8_t counter);
|
|
|
** SendReset - uint8_t McuOneWire_SendReset(void);
|
|
|
** Count - uint8_t McuOneWire_Count(void);
|
|
|
** GetBytes - uint8_t McuOneWire_GetBytes(uint8_t *data, uint8_t count);
|
|
|
** GetByte - uint8_t McuOneWire_GetByte(uint8_t *data);
|
|
|
** strcatRomCode - uint8_t McuOneWire_strcatRomCode(uint8_t *buf, size_t bufSize, uint8_t...
|
|
|
** ReadRomCode - uint8_t McuOneWire_ReadRomCode(uint8_t *romCodeBuffer);
|
|
|
** ResetSearch - void McuOneWire_ResetSearch(void);
|
|
|
** TargetSearch - void McuOneWire_TargetSearch(uint8_t familyCode);
|
|
|
** Search - bool McuOneWire_Search(uint8_t *newAddr, bool search_mode);
|
|
|
** ParseCommand - uint8_t McuOneWire_ParseCommand(const unsigned char* cmd, bool *handled,...
|
|
|
** Deinit - void McuOneWire%.Init(void) McuOneWire_Deinit(void);
|
|
|
** Init - void McuOneWire%.Init(void) McuOneWire_Init(void);
|
|
|
**
|
|
|
** * Copyright (c) Original implementation: Omar Isa<EFBFBD> Pinales Ayala, 2014, all rights reserved.
|
|
|
** * Updated and maintained by Erich Styger, 2014-2020
|
|
|
** * Web: https://mcuoneclipse.com
|
|
|
** * SourceForge: https://sourceforge.net/projects/mcuoneclipse
|
|
|
** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx
|
|
|
** * All rights reserved.
|
|
|
** *
|
|
|
** * Redistribution and use in source and binary forms, with or without modification,
|
|
|
** * are permitted provided that the following conditions are met:
|
|
|
** *
|
|
|
** * - Redistributions of source code must retain the above copyright notice, this list
|
|
|
** * of conditions and the following disclaimer.
|
|
|
** *
|
|
|
** * - Redistributions in binary form must reproduce the above copyright notice, this
|
|
|
** * list of conditions and the following disclaimer in the documentation and/or
|
|
|
** * other materials provided with the distribution.
|
|
|
** *
|
|
|
** * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
|
** * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
** * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
** * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
|
** * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
** * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
** * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
|
** * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
** * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
** ###################################################################*/
|
|
|
/*!
|
|
|
** @file McuOneWire.h
|
|
|
** @version 01.00
|
|
|
** @brief
|
|
|
** This is a component implementing the 1-Wire protocol.
|
|
|
*/
|
|
|
/*!
|
|
|
** @addtogroup McuOneWire_module McuOneWire module documentation
|
|
|
** @{
|
|
|
*/
|
|
|
|
|
|
/* MODULE McuOneWire. */
|
|
|
|
|
|
#include "McuOneWire.h"
|
|
|
#include "DQ1.h" /* data pin */
|
|
|
#include "InputRB1.h" /* input ring buffer */
|
|
|
#include "McuUtility.h" /* Utility */
|
|
|
#include "McuWait.h" /* Waiting */
|
|
|
|
|
|
/* global search state and information */
|
|
|
static unsigned char ROM_NO[8];
|
|
|
static uint8_t LastDiscrepancy;
|
|
|
static uint8_t LastFamilyDiscrepancy;
|
|
|
static uint8_t LastDeviceFlag;
|
|
|
|
|
|
/* Rom commands */
|
|
|
#define RC_READ_ROM 0x33
|
|
|
#define RC_MATCH_ROM 0x55
|
|
|
#define RC_SKIP_ROM 0xCC
|
|
|
#define RC_SEARCH_COND 0xEC
|
|
|
#define RC_SEARCH 0xF0
|
|
|
#define RC_RELEASE 0xFF
|
|
|
|
|
|
#if McuOneWire_CONFIG_WRITE_PIN /* extra pin only for write bit */
|
|
|
#define DQ_Init DQ1_Init(); McuOneWire_CONFIG_WRITE_PIN_INIT
|
|
|
#define DQ_Deinit DQ1_Deinit(); McuOneWire_CONFIG_WRITE_PIN_DEINIT
|
|
|
#else
|
|
|
#define DQ_Init DQ1_Init()
|
|
|
#define DQ_Deinit DQ1_Deinit()
|
|
|
#endif
|
|
|
#if McuOneWire_CONFIG_WRITE_PIN /* using dedicated circuit with separate pin to control the 1-wire write */
|
|
|
#define DQ_SetLow McuOneWire_CONFIG_WRITE_PIN_SET_OUTPUT
|
|
|
#define DQ_Low McuOneWire_CONFIG_WRITE_PIN_HIGH
|
|
|
#define DQ_Floating McuOneWire_CONFIG_WRITE_PIN_LOW
|
|
|
#else
|
|
|
#define DQ_SetLow DQ1_ClrVal()
|
|
|
#define DQ_Low DQ1_SetOutput()
|
|
|
#define DQ_Floating DQ1_SetInput()
|
|
|
#endif
|
|
|
#if McuOneWire_CONFIG_DEBUG_READ_PIN_ENABLED
|
|
|
#define DBG_Init McuOneWire_CONFIG_DEBUG_READ_PIN_INIT
|
|
|
#define DBG_Deinit McuOneWire_CONFIG_DEBUG_READ_PIN_DEINIT
|
|
|
#define DQ_Read (McuOneWire_CONFIG_DEBUG_READ_PIN_TOGGLE, DQ1_GetVal()!=0)
|
|
|
#else
|
|
|
#define DBG_Init /* empty */
|
|
|
#define DBG_Deinit /* empty */
|
|
|
#define DQ_Read (DQ1_GetVal()!=0)
|
|
|
#endif
|
|
|
|
|
|
static uint8_t read_bit(void) {
|
|
|
uint8_t bit;
|
|
|
McuCriticalSection_CriticalVariable();
|
|
|
|
|
|
McuCriticalSection_EnterCritical();
|
|
|
DQ_Low;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_A_READ_LOW_TIME);
|
|
|
DQ_Floating;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_E_BEFORE_READ_DELAY_TIME);
|
|
|
bit = DQ_Read;
|
|
|
McuCriticalSection_ExitCritical();
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_F_AFTER_READ_DELAY_TIME);
|
|
|
return bit;
|
|
|
}
|
|
|
|
|
|
static void write_bit(uint8_t bit) {
|
|
|
McuCriticalSection_CriticalVariable();
|
|
|
|
|
|
if (bit&1) {
|
|
|
McuCriticalSection_EnterCritical();
|
|
|
DQ_Low;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_A_WRITE_1_LOW_TIME);
|
|
|
DQ_Floating;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_B_WRITE_1_HIGH_TIME);
|
|
|
McuCriticalSection_ExitCritical();
|
|
|
} else { /* zero bit */
|
|
|
McuCriticalSection_EnterCritical();
|
|
|
DQ_Low;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_C_WRITE_0_LOW_TIME);
|
|
|
DQ_Floating;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_D_WRITE_0_HIGH_TIME);
|
|
|
McuCriticalSection_ExitCritical();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#if McuOneWire_CONFIG_PARSE_COMMAND_ENABLED
|
|
|
static uint8_t PrintStatus(const McuShell_StdIOType *io) {
|
|
|
McuShell_SendStatusStr((unsigned char*)"McuOneWire", (unsigned char*)"\r\n", io->stdOut);
|
|
|
#if McuOneWire_CONFIG_DEBUG_READ_PIN_ENABLED
|
|
|
McuShell_SendStatusStr((unsigned char*)" debug pin", (unsigned char*)"yes\r\n", io->stdOut);
|
|
|
#else
|
|
|
McuShell_SendStatusStr((unsigned char*)" debug pin", (unsigned char*)"no\r\n", io->stdOut);
|
|
|
#endif
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
static uint8_t PrintHelp(const McuShell_StdIOType *io) {
|
|
|
McuShell_SendHelpStr((unsigned char*)"McuOneWire", (unsigned char*)"Group of McuOneWire commands\r\n", io->stdOut);
|
|
|
McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut);
|
|
|
McuShell_SendHelpStr((unsigned char*)" reset", (unsigned char*)"Send a RESET sequence to the bus\r\n", io->stdOut);
|
|
|
McuShell_SendHelpStr((unsigned char*)" read rom", (unsigned char*)"Send a READ ROM (0x33) to the bus\r\n", io->stdOut);
|
|
|
McuShell_SendHelpStr((unsigned char*)" search", (unsigned char*)"Search for devices on the bus\r\n", io->stdOut);
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
#endif /* McuOneWire_CONFIG_PARSE_COMMAND_ENABLED */
|
|
|
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : SendReset (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Sends a reset to the bus
|
|
|
** Parameters : None
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_SendReset(void)
|
|
|
{
|
|
|
uint8_t bit;
|
|
|
McuCriticalSection_CriticalVariable();
|
|
|
|
|
|
McuCriticalSection_EnterCritical();
|
|
|
DQ_Low;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_H_RESET_TIME);
|
|
|
DQ_Floating;
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_I_RESET_RESPONSE_TIME);
|
|
|
bit = DQ_Read;
|
|
|
McuCriticalSection_ExitCritical();
|
|
|
McuWait_Waitus(McuOneWire_CONFIG_J_RESET_WAIT_TIME);
|
|
|
if (!bit) { /* a device pulled the data line low: at least one device is present */
|
|
|
return ERR_OK;
|
|
|
} else {
|
|
|
return ERR_BUSOFF; /* no device on the bus? */
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : SendByte (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Sends a single byte
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** data - the data byte to be sent
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_SendByte(uint8_t data)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
for(i=0;i<8;i++) {
|
|
|
write_bit(data&1); /* send LSB first */
|
|
|
data >>= 1; /* next bit */
|
|
|
} /* for */
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : SendBytes (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Sends multiple bytes
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * data - Pointer to the array of bytes
|
|
|
** count - Number of bytes to be sent
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_SendBytes(uint8_t *data, uint8_t count)
|
|
|
{
|
|
|
uint8_t res;
|
|
|
|
|
|
while(count>0) {
|
|
|
res = McuOneWire_SendByte(*data);
|
|
|
if (res!=ERR_OK) {
|
|
|
return res; /* failed */
|
|
|
}
|
|
|
data++;
|
|
|
count--;
|
|
|
}
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : Receive (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Programs a read operation after the master send all in
|
|
|
** output buffer. Don't use a SendReset while the data is
|
|
|
** coming.
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** counter - Number of bytes to receive from
|
|
|
** slave
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_Receive(uint8_t counter)
|
|
|
{
|
|
|
int i;
|
|
|
uint8_t val, mask;
|
|
|
|
|
|
while(counter>0) {
|
|
|
val = 0; mask = 1;
|
|
|
for(i=0;i<8;i++) {
|
|
|
if (read_bit()) { /* read bits (LSB first) */
|
|
|
val |= mask;
|
|
|
}
|
|
|
mask <<= 1; /* next bit */
|
|
|
} /* for */
|
|
|
(void)InputRB1_Put(val); /* put it into the queue so it can be retrieved by GetBytes() */
|
|
|
counter--;
|
|
|
}
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : Count (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Returns the number of elements stored on input buffer that
|
|
|
** are ready to read.
|
|
|
** Parameters : None
|
|
|
** Returns :
|
|
|
** --- - number of elements
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_Count(void)
|
|
|
{
|
|
|
return InputRB1_NofElements();
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : GetByte (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Get a single byte from the bus
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * data - Pointer to were to store the data
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_GetByte(uint8_t *data)
|
|
|
{
|
|
|
if (InputRB1_NofElements()==0) {
|
|
|
return ERR_FAILED;
|
|
|
}
|
|
|
(void)InputRB1_Get(data);
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : GetBytes (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Gets multiple bytes from the bus
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * data - Pointer to where to store the data
|
|
|
** count - Number of bytes
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_GetBytes(uint8_t *data, uint8_t count)
|
|
|
{
|
|
|
if(count > InputRB1_NofElements()) {
|
|
|
return ERR_FAILED;
|
|
|
}
|
|
|
for(;count>0;count--) {
|
|
|
(void)InputRB1_Get(data);
|
|
|
data++;
|
|
|
}
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : CalcCRC (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Calculates the CRC over a number of bytes
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * data - Pointer to data
|
|
|
** dataSize - number of data bytes
|
|
|
** Returns :
|
|
|
** --- - calculated CRC
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_CalcCRC(uint8_t *data, uint8_t dataSize)
|
|
|
{
|
|
|
uint8_t crc, i, x, y;
|
|
|
|
|
|
crc = 0;
|
|
|
for(x=0;x<dataSize;x++){
|
|
|
y = data[x];
|
|
|
for(i=0;i<8;i++) { /* go through all bits of the data byte */
|
|
|
if((crc&0x01)^(y&0x01)) {
|
|
|
crc >>= 1;
|
|
|
crc ^= 0x8c;
|
|
|
} else {
|
|
|
crc >>= 1;
|
|
|
}
|
|
|
y >>= 1;
|
|
|
}
|
|
|
}
|
|
|
return crc;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : Init (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Initializes this device.
|
|
|
** Parameters : None
|
|
|
** Returns : Nothing
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
void McuOneWire_Init(void)
|
|
|
{
|
|
|
#if McuLib_CONFIG_NXP_SDK_USED
|
|
|
/* using SDK, need to initialize inherited components */
|
|
|
DQ_Init; /* data pin */
|
|
|
DBG_Init; /* optional debug pin */
|
|
|
InputRB1_Init(); /* input ring buffer */
|
|
|
#endif
|
|
|
DQ_Floating; /* input mode, let the pull-up take the signal high */
|
|
|
/* load LOW to output register. We won't change that value afterwards, we only switch between output and input/float mode */
|
|
|
DQ_SetLow;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : Deinit (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Driver de-initialization
|
|
|
** Parameters : None
|
|
|
** Returns : Nothing
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
void McuOneWire_Deinit(void)
|
|
|
{
|
|
|
DQ_Deinit; /* data pin */
|
|
|
DQ_Floating; /* input mode, tristate pin */
|
|
|
DBG_Deinit; /* optional debug pin */
|
|
|
InputRB1_Deinit(); /* input ring buffer */
|
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : ParseCommand (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Shell Command Line parser. Method is only available if Shell
|
|
|
** is enabled in the component properties.
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** cmd - command string
|
|
|
** * handled - Pointer to variable which tells if
|
|
|
** the command has been handled or not
|
|
|
** io - Pointer to I/O structure
|
|
|
** Returns :
|
|
|
** --- - Error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_ParseCommand(const unsigned char* cmd, bool *handled, const McuShell_StdIOType *io)
|
|
|
{
|
|
|
#if McuOneWire_CONFIG_PARSE_COMMAND_ENABLED
|
|
|
uint8_t res = ERR_OK;
|
|
|
uint8_t buf[32];
|
|
|
|
|
|
if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP) == 0
|
|
|
|| McuUtility_strcmp((char*)cmd, "McuOneWire help") == 0)
|
|
|
{
|
|
|
*handled = TRUE;
|
|
|
return PrintHelp(io);
|
|
|
} else if ( (McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0)
|
|
|
|| (McuUtility_strcmp((char*)cmd, "McuOneWire status")==0)
|
|
|
)
|
|
|
{
|
|
|
*handled = TRUE;
|
|
|
res = PrintStatus(io);
|
|
|
} else if (McuUtility_strcmp((char*)cmd, "McuOneWire read rom")==0) {
|
|
|
uint8_t rom[McuOneWire_ROM_CODE_SIZE];
|
|
|
|
|
|
*handled = TRUE;
|
|
|
res = McuOneWire_ReadRomCode(&rom[0]);
|
|
|
if (res!=ERR_OK) {
|
|
|
McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ReadRomCode() ERROR (");
|
|
|
McuUtility_strcatNum8u(buf, sizeof(buf), res);
|
|
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)")\r\n");
|
|
|
McuShell_SendStr(buf, io->stdErr);
|
|
|
} else {
|
|
|
buf[0] = '\0';
|
|
|
(void)McuOneWire_strcatRomCode(buf, sizeof(buf), &rom[0]);
|
|
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n");
|
|
|
McuShell_SendStr(buf, io->stdOut);
|
|
|
}
|
|
|
} else if (McuUtility_strcmp((char*)cmd, "McuOneWire reset")==0) {
|
|
|
*handled = TRUE;
|
|
|
res = McuOneWire_SendReset();
|
|
|
if (res==ERR_OK) {
|
|
|
McuShell_SendStr((unsigned char*)"Device present\r\n", io->stdOut);
|
|
|
} else {
|
|
|
McuShell_SendStr((unsigned char*)"No device present?\r\n", io->stdErr);
|
|
|
}
|
|
|
} else if (McuUtility_strcmp((char*)cmd, "McuOneWire search")==0) {
|
|
|
uint8_t rom[McuOneWire_ROM_CODE_SIZE];
|
|
|
bool found;
|
|
|
int nofFound = 0;
|
|
|
|
|
|
*handled = TRUE;
|
|
|
McuOneWire_ResetSearch();
|
|
|
do {
|
|
|
found = McuOneWire_Search(&rom[0], TRUE);
|
|
|
if (found) {
|
|
|
nofFound++;
|
|
|
buf[0] = '\0';
|
|
|
(void)McuOneWire_strcatRomCode(buf, sizeof(buf), &rom[0]);
|
|
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n");
|
|
|
McuShell_SendStr(buf, io->stdOut);
|
|
|
}
|
|
|
} while(found);
|
|
|
if (nofFound==0) {
|
|
|
McuShell_SendStr((unsigned char*)"No device found!\r\n", io->stdErr);
|
|
|
}
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
return res;
|
|
|
#else
|
|
|
(void)cmd;
|
|
|
(void)handled;
|
|
|
(void)io;
|
|
|
return ERR_OK;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : ReadRomCode (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Read the ROM code. Only works with one device on the bus.
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * romCodeBuffer - Pointer to a buffer
|
|
|
** with 8 bytes where the ROM code gets stored
|
|
|
** Returns :
|
|
|
** --- - Error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_ReadRomCode(uint8_t *romCodeBuffer)
|
|
|
{
|
|
|
uint8_t res;
|
|
|
|
|
|
McuOneWire_SendReset();
|
|
|
McuOneWire_SendByte(RC_READ_ROM);
|
|
|
McuOneWire_Receive(McuOneWire_ROM_CODE_SIZE); /* 8 bytes for the ROM code */
|
|
|
McuOneWire_SendByte(RC_RELEASE);
|
|
|
/* copy ROM code */
|
|
|
res = McuOneWire_GetBytes(romCodeBuffer, McuOneWire_ROM_CODE_SIZE); /* 8 bytes */
|
|
|
if (res!=ERR_OK) {
|
|
|
return res; /* error */
|
|
|
}
|
|
|
/* index 0 : family code
|
|
|
index 1-6: 48bit serial number
|
|
|
index 7 : CRC
|
|
|
*/
|
|
|
if (McuOneWire_CalcCRC(&romCodeBuffer[0], McuOneWire_ROM_CODE_SIZE-1)!=romCodeBuffer[McuOneWire_ROM_CODE_SIZE-1]) {
|
|
|
return ERR_CRC; /* wrong CRC? */
|
|
|
}
|
|
|
return ERR_OK; /* ok */
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : strcatRomCode (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Appends the ROM code to a string.
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * buf - Pointer to zero terminated buffer
|
|
|
** bufSize - size of buffer
|
|
|
** * romCode - Pointer to 8 bytes of ROM Code
|
|
|
** Returns :
|
|
|
** --- - error code
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
uint8_t McuOneWire_strcatRomCode(uint8_t *buf, size_t bufSize, uint8_t *romCode)
|
|
|
{
|
|
|
int j;
|
|
|
|
|
|
for(j=0;j<McuOneWire_ROM_CODE_SIZE;j++) {
|
|
|
McuUtility_strcatNum8Hex(buf, bufSize, romCode[j]);
|
|
|
if(j<McuOneWire_ROM_CODE_SIZE-1) {
|
|
|
McuUtility_chcat(buf, bufSize, '-');
|
|
|
}
|
|
|
}
|
|
|
return ERR_OK;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : ResetSearch (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
** Reset the search state
|
|
|
** Parameters : None
|
|
|
** Returns : Nothing
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
void McuOneWire_ResetSearch(void)
|
|
|
{
|
|
|
/* reset the search state */
|
|
|
int i;
|
|
|
|
|
|
LastDiscrepancy = 0;
|
|
|
LastDeviceFlag = FALSE;
|
|
|
LastFamilyDiscrepancy = 0;
|
|
|
for(i = 7; ; i--) {
|
|
|
ROM_NO[i] = 0;
|
|
|
if (i==0) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : TargetSearch (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
**
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** familyCode - family code to restrict
|
|
|
** search for
|
|
|
** Returns : Nothing
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
void McuOneWire_TargetSearch(uint8_t familyCode)
|
|
|
{
|
|
|
/* set the search state to find SearchFamily type devices */
|
|
|
int i;
|
|
|
|
|
|
ROM_NO[0] = familyCode;
|
|
|
for (i = 1; i < 8; i++) {
|
|
|
ROM_NO[i] = 0;
|
|
|
}
|
|
|
LastDiscrepancy = 64;
|
|
|
LastFamilyDiscrepancy = 0;
|
|
|
LastDeviceFlag = FALSE;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
** ===================================================================
|
|
|
** Method : Search (component OneWire)
|
|
|
**
|
|
|
** Description :
|
|
|
**
|
|
|
** Parameters :
|
|
|
** NAME - DESCRIPTION
|
|
|
** * newAddr - Pointer to 8 bytes of data where
|
|
|
** to store the new address
|
|
|
** search_mode -
|
|
|
** Returns :
|
|
|
** --- - TRUE if new device has been found, FALSE
|
|
|
** otherwise.
|
|
|
** ===================================================================
|
|
|
*/
|
|
|
bool McuOneWire_Search(uint8_t *newAddr, bool search_mode)
|
|
|
{
|
|
|
/* Version from https://raw.githubusercontent.com/PaulStoffregen/OneWire/master/OneWire.cpp */
|
|
|
/*-------------------------------------------------------------------------- */
|
|
|
/* Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing */
|
|
|
/* search state. */
|
|
|
/* Return TRUE : device found, ROM number in ROM_NO buffer */
|
|
|
/* FALSE : device not found, end of search */
|
|
|
uint8_t id_bit_number;
|
|
|
uint8_t last_zero, rom_byte_number, search_result;
|
|
|
uint8_t id_bit, cmp_id_bit;
|
|
|
unsigned char rom_byte_mask, search_direction;
|
|
|
uint8_t res;
|
|
|
|
|
|
/* initialize for search */
|
|
|
id_bit_number = 1;
|
|
|
last_zero = 0;
|
|
|
rom_byte_number = 0;
|
|
|
rom_byte_mask = 1;
|
|
|
search_result = 0;
|
|
|
|
|
|
/* if the last call was not the last one */
|
|
|
if (!LastDeviceFlag) {
|
|
|
/* 1-Wire reset */
|
|
|
res = McuOneWire_SendReset();
|
|
|
if (res!=ERR_OK) {
|
|
|
/* reset the search */
|
|
|
LastDiscrepancy = 0;
|
|
|
LastDeviceFlag = FALSE;
|
|
|
LastFamilyDiscrepancy = 0;
|
|
|
return FALSE;
|
|
|
}
|
|
|
/* issue the search command */
|
|
|
if (search_mode) {
|
|
|
McuOneWire_SendByte(RC_SEARCH); /* NORMAL SEARCH */
|
|
|
} else {
|
|
|
McuOneWire_SendByte(RC_SEARCH_COND); /* CONDITIONAL SEARCH */
|
|
|
}
|
|
|
/* loop to do the search */
|
|
|
do {
|
|
|
/* read a bit and its complement */
|
|
|
id_bit = read_bit();
|
|
|
cmp_id_bit = read_bit();
|
|
|
|
|
|
/* check for no devices on 1-wire */
|
|
|
if ((id_bit==1) && (cmp_id_bit==1)) {
|
|
|
break;
|
|
|
} else {
|
|
|
/* all devices coupled have 0 or 1 */
|
|
|
if (id_bit != cmp_id_bit) {
|
|
|
search_direction = id_bit; /* bit write value for search */
|
|
|
} else {
|
|
|
/* if this discrepancy if before the Last Discrepancy */
|
|
|
/* on a previous next then pick the same as last time */
|
|
|
if (id_bit_number < LastDiscrepancy) {
|
|
|
search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
|
|
|
} else {
|
|
|
/* if equal to last pick 1, if not then pick 0 */
|
|
|
search_direction = (id_bit_number == LastDiscrepancy);
|
|
|
}
|
|
|
/* if 0 was picked then record its position in LastZero */
|
|
|
if (search_direction == 0) {
|
|
|
last_zero = id_bit_number;
|
|
|
/* check for Last discrepancy in family */
|
|
|
if (last_zero < 9)
|
|
|
LastFamilyDiscrepancy = last_zero;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* set or clear the bit in the ROM byte rom_byte_number */
|
|
|
/* with mask rom_byte_mask */
|
|
|
if (search_direction == 1) {
|
|
|
ROM_NO[rom_byte_number] |= rom_byte_mask;
|
|
|
} else {
|
|
|
ROM_NO[rom_byte_number] &= ~rom_byte_mask;
|
|
|
}
|
|
|
/* serial number search direction write bit */
|
|
|
write_bit(search_direction);
|
|
|
|
|
|
/* increment the byte counter id_bit_number */
|
|
|
/* and shift the mask rom_byte_mask */
|
|
|
id_bit_number++;
|
|
|
rom_byte_mask <<= 1;
|
|
|
|
|
|
/* if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask */
|
|
|
if (rom_byte_mask == 0) {
|
|
|
rom_byte_number++;
|
|
|
rom_byte_mask = 1;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
while(rom_byte_number < 8); /* loop until through all ROM bytes 0-7 */
|
|
|
/* if the search was successful then */
|
|
|
if (!(id_bit_number < 65)) {
|
|
|
/* search successful so set LastDiscrepancy,LastDeviceFlag,search_result */
|
|
|
LastDiscrepancy = last_zero;
|
|
|
|
|
|
/* check for last device */
|
|
|
if (LastDiscrepancy == 0) {
|
|
|
LastDeviceFlag = TRUE;
|
|
|
}
|
|
|
search_result = TRUE;
|
|
|
}
|
|
|
}
|
|
|
/* if no device found then reset counters so next 'search' will be like a first */
|
|
|
if (!search_result || !ROM_NO[0]) {
|
|
|
LastDiscrepancy = 0;
|
|
|
LastDeviceFlag = FALSE;
|
|
|
LastFamilyDiscrepancy = 0;
|
|
|
search_result = FALSE;
|
|
|
} else {
|
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
newAddr[i] = ROM_NO[i];
|
|
|
}
|
|
|
}
|
|
|
return search_result;
|
|
|
}
|
|
|
|
|
|
/* END McuOneWire. */
|
|
|
|
|
|
/*!
|
|
|
** @}
|
|
|
*/
|
|
|
|