Skip to content

Instantly share code, notes, and snippets.

@wero1414
Created April 27, 2022 22:15
Show Gist options
  • Save wero1414/2a1db598f80547bdfc5f3cf2e3de93e9 to your computer and use it in GitHub Desktop.
Save wero1414/2a1db598f80547bdfc5f3cf2e3de93e9 to your computer and use it in GitHub Desktop.
/*******************************************************************************
Main Source File
Company:
Microchip Technology Inc.
File Name:
main.c
Summary:
This file contains the "main" function for a project.
Description:
This file contains the "main" function for a project. The
"main" function calls the "SYS_Initialize" function to initialize the state
machines of all modules in the system
*******************************************************************************/
// DOM-IGNORE-BEGIN
/*******************************************************************************
* Copyright (C) 2018 Microchip Technology Inc. and its subsidiaries.
*
* Subject to your compliance with these terms, you may use Microchip software
* and any derivatives exclusively with Microchip products. It is your
* responsibility to comply with third party license terms applicable to your
* use of third party software (including open source software) that may
* accompany Microchip software.
*
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
* PARTICULAR PURPOSE.
*
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
*******************************************************************************/
// DOM-IGNORE-END
// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************
#include <stddef.h> // Defines NULL
#include <stdbool.h> // Defines true
#include <stdlib.h> // Defines EXIT_FAILURE
#include "definitions.h" // SYS function prototypes
#include <string.h>
#define LED_ON() LED_Clear()
#define LED_OFF() LED_Set()
#define APP_AT24MAC_DEVICE_ADDR 0x50
#define APP_AT24MAC_MEMORY_ADDR 0x00
#define APP_AT24MAC_MEMORY_ADDR1 0x00
#define APP_TRANSMIT_DATA_LENGTH 6
#define APP_ACK_DATA_LENGTH 1
#define APP_RECEIVE_DUMMY_WRITE_LENGTH 2
#define APP_RECEIVE_DATA_LENGTH 4
//static uint8_t testTxData[APP_TRANSMIT_DATA_LENGTH] =
//{
// APP_AT24MAC_MEMORY_ADDR,APP_AT24MAC_MEMORY_ADDR1,
// 'M','C','H','P',
//};
uint8_t testTxData1[3];
uint8_t testRxData[APP_RECEIVE_DATA_LENGTH];
typedef enum
{
APP_STATE_EEPROM_STATUS_VERIFY,
APP_STATE_EEPROM_WRITE,
APP_STATE_EEPROM_WAIT_WRITE_COMPLETE,
APP_STATE_EEPROM_CHECK_INTERNAL_WRITE_STATUS,
APP_STATE_EEPROM_READ,
APP_STATE_EEPROM_WAIT_READ_COMPLETE,
APP_STATE_VERIFY,
APP_STATE_IDLE,
APP_STATE_XFER_SUCCESSFUL,
APP_STATE_XFER_ERROR
} APP_STATES;
typedef enum
{
APP_TRANSFER_STATUS_IN_PROGRESS,
APP_TRANSFER_STATUS_SUCCESS,
APP_TRANSFER_STATUS_ERROR,
APP_TRANSFER_STATUS_IDLE,
} APP_TRANSFER_STATUS;
void APP_I2CCallback(uintptr_t context )
{
APP_TRANSFER_STATUS* transferStatus = (APP_TRANSFER_STATUS*)context;
if(SERCOM2_I2C_ErrorGet() == SERCOM_I2C_ERROR_NONE)
{
if (transferStatus)
{
*transferStatus = APP_TRANSFER_STATUS_SUCCESS;
}
}
else
{
if (transferStatus)
{
*transferStatus = APP_TRANSFER_STATUS_ERROR;
}
}
}
// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************
int main ( void )
{
APP_STATES state = APP_STATE_EEPROM_STATUS_VERIFY;
volatile APP_TRANSFER_STATUS transferStatus = APP_TRANSFER_STATUS_ERROR;
uint8_t ackData = 0;
/* Initialize all modules */
SYS_Initialize ( NULL );
SERCOM2_I2C_CallbackRegister( APP_I2CCallback, (uintptr_t)&transferStatus );
testTxData1[0]=0x00;
testTxData1[1]=0x01;
testTxData1[2]=0xEE;
// transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
// SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &ackData, APP_ACK_DATA_LENGTH);
// while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
//
// transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
// SERCOM2_I2C_WriteRead(APP_AT24MAC_DEVICE_ADDR, &ackData[0], 2, &testRxData[0], 1);
// while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
//
for(int i=0;i<3;i++){
transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
ackData = testTxData1[i];
SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &ackData, APP_ACK_DATA_LENGTH);
while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
}
transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
SERCOM2_I2C_WriteRead(APP_AT24MAC_DEVICE_ADDR, &testTxData1[0], 2, &testRxData[0], 1);
while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
//
// transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
// SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &testTxData1[0], 3);
// while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
//
// transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
// SERCOM2_I2C_WriteRead(APP_AT24MAC_DEVICE_ADDR, &testTxData1[0], 2, &testRxData[0], 1);
// while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
// transferStatus=APP_TRANSFER_STATUS_IN_PROGRESS;
// SERCOM2_I2C_WriteRead(APP_AT24MAC_DEVICE_ADDR, &testTxData1[0], 2, &testRxData[0], 1);
// while(transferStatus==APP_TRANSFER_STATUS_IN_PROGRESS);
//
//
while(1);
while(1)
{
/* Check the application's current state. */
switch (state)
{
case APP_STATE_EEPROM_STATUS_VERIFY:
/* Register the TWIHS Callback with transfer status as context */
SERCOM2_I2C_CallbackRegister( APP_I2CCallback, (uintptr_t)&transferStatus );
// /* Verify if EEPROM is ready to accept new requests */
// transferStatus = APP_TRANSFER_STATUS_IN_PROGRESS;
// SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &ackData, APP_ACK_DATA_LENGTH);
state = APP_STATE_EEPROM_WRITE;
break;
case APP_STATE_EEPROM_WRITE:
//if (transferStatus == APP_TRANSFER_STATUS_SUCCESS)
//{
/* Write data to EEPROM */
transferStatus = APP_TRANSFER_STATUS_IN_PROGRESS;
SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &testTxData1[0], 3);
state = APP_STATE_EEPROM_WAIT_WRITE_COMPLETE;
//}
//else if (transferStatus == APP_TRANSFER_STATUS_ERROR)
//{
/* EEPROM is not ready to accept new requests.
* Keep checking until the EEPROM becomes ready. */
state = APP_STATE_EEPROM_STATUS_VERIFY;
//}
break;
case APP_STATE_EEPROM_WAIT_WRITE_COMPLETE:
if (transferStatus == APP_TRANSFER_STATUS_SUCCESS)
{
/* Read the status of internal write cycle */
//transferStatus = APP_TRANSFER_STATUS_IN_PROGRESS;
//SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &ackData, APP_ACK_DATA_LENGTH);
state = APP_STATE_EEPROM_CHECK_INTERNAL_WRITE_STATUS;
}
else if (transferStatus == APP_TRANSFER_STATUS_ERROR)
{
state = APP_STATE_XFER_ERROR;
}
break;
case APP_STATE_EEPROM_CHECK_INTERNAL_WRITE_STATUS:
if (transferStatus == APP_TRANSFER_STATUS_SUCCESS)
{
state = APP_STATE_EEPROM_READ;
}
else if (transferStatus == APP_TRANSFER_STATUS_ERROR)
{
/* EEPROM's internal write cycle is not complete. Keep checking. */
transferStatus = APP_TRANSFER_STATUS_IN_PROGRESS;
SERCOM2_I2C_Write(APP_AT24MAC_DEVICE_ADDR, &ackData, APP_ACK_DATA_LENGTH);
}
break;
case APP_STATE_EEPROM_READ:
transferStatus = APP_TRANSFER_STATUS_IN_PROGRESS;
/* Read the data from the page written earlier */
SERCOM2_I2C_WriteRead(APP_AT24MAC_DEVICE_ADDR, &testTxData1[0], 2, &testRxData[0], 1);
state = APP_STATE_EEPROM_WAIT_READ_COMPLETE;
break;
case APP_STATE_EEPROM_WAIT_READ_COMPLETE:
if (transferStatus == APP_TRANSFER_STATUS_SUCCESS)
{
state = APP_STATE_VERIFY;
}
else if (transferStatus == APP_TRANSFER_STATUS_ERROR)
{
state = APP_STATE_XFER_ERROR;
}
break;
case APP_STATE_VERIFY:
if (memcmp(&testTxData1[2], &testRxData[0], 1) != 0 )
{
/* It means received data is not same as transmitted data */
state = APP_STATE_XFER_ERROR;
}
else
{
/* It means received data is same as transmitted data */
state = APP_STATE_XFER_SUCCESSFUL;
}
break;
case APP_STATE_XFER_SUCCESSFUL:
{
LED_ON();
break;
}
case APP_STATE_XFER_ERROR:
{
LED_OFF();
break;
}
default:
break;
}
}
}
/*******************************************************************************
End of File
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment