aboutsummaryrefslogtreecommitdiff
path: root/tmp/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'tmp/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c')
-rw-r--r--tmp/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c345
1 files changed, 345 insertions, 0 deletions
diff --git a/tmp/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c b/tmp/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c
new file mode 100644
index 0000000..ce8cb69
--- /dev/null
+++ b/tmp/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c
@@ -0,0 +1,345 @@
+/**
+ ******************************************************************************
+ * @file I2C/EEPROM/main.c
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 08-April-2011
+ * @brief Main program body
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_eval_i2c_ee.h"
+
+
+#ifdef USE_STM3210E_EVAL
+ #include "stm3210e_eval_lcd.h"
+#elif defined(USE_STM3210B_EVAL)
+ #include "stm3210b_eval_lcd.h"
+#elif defined(USE_STM3210C_EVAL)
+ #include "stm3210c_eval_lcd.h"
+#elif defined(USE_STM32100B_EVAL)
+ #include "stm32100b_eval_lcd.h"
+#elif defined(USE_STM32100E_EVAL)
+ #include "stm32100e_eval_lcd.h"
+#endif /* USE_STM3210E_EVAL */
+
+/** @addtogroup STM32F10x_StdPeriph_Examples
+ * @{
+ */
+
+/** @addtogroup I2C_EEPROM
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
+
+/* Private define ------------------------------------------------------------*/
+/* Uncomment the following line to enable using LCD screen for messages display */
+#define ENABLE_LCD_MSG_DISPLAY
+
+#define sEE_WRITE_ADDRESS1 0x50
+#define sEE_READ_ADDRESS1 0x50
+#define BUFFER_SIZE1 (countof(Tx1_Buffer)-1)
+#define BUFFER_SIZE2 (countof(Tx2_Buffer)-1)
+#define sEE_WRITE_ADDRESS2 (sEE_WRITE_ADDRESS1 + BUFFER_SIZE1)
+#define sEE_READ_ADDRESS2 (sEE_READ_ADDRESS1 + BUFFER_SIZE1)
+
+/* Private macro -------------------------------------------------------------*/
+#define countof(a) (sizeof(a) / sizeof(*(a)))
+
+/* Private variables ---------------------------------------------------------*/
+uint8_t Tx1_Buffer[] = "/* STM32F10xx I2C Firmware Library EEPROM driver example: \
+ buffer 1 transfer into address sEE_WRITE_ADDRESS1 */ \
+ Example Description \
+ This firmware provides a basic example of how to use the I2C firmware library and\
+ an associate I2C EEPROM driver to communicate with an I2C EEPROM device (here the\
+ example is interfacing with M24C64 EEPROM)\
+ \
+ I2C peripheral is configured in Master transmitter during write operation and in\
+ Master receiver during read operation from I2C EEPROM. \
+ \
+ The peripheral used is I2C1 but can be configured by modifying the defines values\
+ in stm32xxxx_eval.h file. The speed is set to 200kHz and can be configured by \
+ modifying the relative define in stm32_eval_i2c_ee.h file.\
+ \
+ For M24C64 devices all the memory is accessible through the two-bytes \
+ addressing mode and need to define block addresses. In this case, only the physical \
+ address has to be defined (according to the address pins (E0,E1 and E2) connection).\
+ This address is defined in i2c_ee.h (default is 0xA0: E0, E1 and E2 tied to ground).\
+ The EEPROM addresses where the program start the write and the read operations \
+ is defined in the main.c file. \
+ \
+ First, the content of Tx1_Buffer is written to the EEPROM_WriteAddress1 and the\
+ written data are read. The written and the read buffers data are then compared.\
+ Following the read operation, the program waits that the EEPROM reverts to its \
+ Standby state. A second write operation is, then, performed and this time, Tx2_Buffer\
+ is written to EEPROM_WriteAddress2, which represents the address just after the last \
+ written one in the first write. After completion of the second write operation, the \
+ written data are read. The contents of the written and the read buffers are compared.\
+ \
+ All transfers are managed in DMA mode (except when 1-byte read/write operation is\
+ required). Once sEE_ReadBuffer() or sEE_WriteBuffer() function is called, the \
+ use application may perform other tasks in parallel while Read/Write operation is\
+ managed by DMA.\
+ \
+ This example provides the possibility to use the STM32XXXX-EVAL LCD screen for\
+ messages display (transfer status: Ongoing, PASSED, FAILED).\
+ To enable this option uncomment the define ENABLE_LCD_MSG_DISPLAY in the main.c\
+ file. ";
+uint8_t Tx2_Buffer[] = "/* STM32F10xx I2C Firmware Library EEPROM driver example: \
+ buffer 2 transfer into address sEE_WRITE_ADDRESS2 */";
+uint8_t Rx1_Buffer[BUFFER_SIZE1], Rx2_Buffer[BUFFER_SIZE2];
+volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = FAILED;
+volatile uint16_t NumDataRead = 0;
+
+/* Private functions ---------------------------------------------------------*/
+TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+int main(void)
+{
+ /*!< At this stage the microcontroller clock setting is already configured,
+ this is done through SystemInit() function which is called from startup
+ file (startup_stm32f10x_xx.s) before to branch to application main.
+ To reconfigure the default setting of SystemInit() function, refer to
+ system_stm32f10x.c file
+ */
+
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ /* Initialize the LCD screen for information display */
+ #ifdef USE_STM3210E_EVAL
+ STM3210E_LCD_Init();
+ #elif defined(USE_STM3210B_EVAL)
+ STM3210B_LCD_Init();
+ #elif defined(USE_STM3210C_EVAL)
+ STM3210C_LCD_Init();
+ #elif defined(USE_STM32100B_EVAL)
+ STM32100B_LCD_Init();
+ #elif defined(USE_STM32100E_EVAL)
+ STM32100E_LCD_Init();
+ #endif /* USE_STM3210E_EVAL */
+
+ /* Display application information */
+ LCD_Clear(LCD_COLOR_BLUE);
+ LCD_SetBackColor(LCD_COLOR_BLUE);
+ LCD_SetTextColor(LCD_COLOR_WHITE);
+ LCD_DisplayStringLine(LCD_LINE_0, "SMT32F1xx FW Library");
+ LCD_DisplayStringLine(LCD_LINE_1, " EEPROM Example ");
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+ /* Initialize the I2C EEPROM driver ----------------------------------------*/
+ sEE_Init();
+
+ /* First write in the memory followed by a read of the written data --------*/
+ /* Write on I2C EEPROM from sEE_WRITE_ADDRESS1 */
+ sEE_WriteBuffer(Tx1_Buffer, sEE_WRITE_ADDRESS1, BUFFER_SIZE1);
+
+ /* Set the Number of data to be read */
+ NumDataRead = BUFFER_SIZE1;
+
+ /* Read from I2C EEPROM from sEE_READ_ADDRESS1 */
+ sEE_ReadBuffer(Rx1_Buffer, sEE_READ_ADDRESS1, (uint16_t *)(&NumDataRead));
+
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ LCD_DisplayStringLine(LCD_LINE_3, " Transfer 1 Ongoing ");
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+ /* Wait till DMA transfer is complete (Transfer complete interrupt handler
+ resets the variable holding the number of data to be read) */
+ while (NumDataRead > 0)
+ {
+ /* Starting from this point, if the requested number of data is higher than 1,
+ then only the DMA is managing the data transfer. Meanwhile, CPU is free to
+ perform other tasks:
+
+ // Add your code here:
+ //...
+ //...
+
+ For simplicity reasons, this example is just waiting till the end of the
+ transfer. */
+ }
+
+ /* Check if the data written to the memory is read correctly */
+ TransferStatus1 = Buffercmp(Tx1_Buffer, Rx1_Buffer, BUFFER_SIZE1);
+ /* TransferStatus1 = PASSED, if the transmitted and received data
+ to/from the EEPROM are the same */
+ /* TransferStatus1 = FAILED, if the transmitted and received data
+ to/from the EEPROM are different */
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ if (TransferStatus1 == PASSED)
+ {
+ LCD_DisplayStringLine(LCD_LINE_3, " Transfer 1 PASSED ");
+ }
+ else
+ {
+ LCD_DisplayStringLine(LCD_LINE_3, " Transfer 1 FAILED ");
+ }
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+/*----------------------------------
+
+ ------------------------------------------*/
+
+ /* Second write in the memory followed by a read of the written data -------*/
+ /* Write on I2C EEPROM from sEE_WRITE_ADDRESS2 */
+ sEE_WriteBuffer(Tx2_Buffer, sEE_WRITE_ADDRESS2, BUFFER_SIZE2);
+
+ /* Set the Number of data to be read */
+ NumDataRead = BUFFER_SIZE2;
+
+ /* Read from I2C EEPROM from sEE_READ_ADDRESS2 */
+ sEE_ReadBuffer(Rx2_Buffer, sEE_READ_ADDRESS2, (uint16_t *)(&NumDataRead));
+
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ LCD_DisplayStringLine(LCD_LINE_5, " Transfer 2 Ongoing ");
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+ /* Wait till DMA transfer is complete (Transfer complete interrupt handler
+ resets the variable holding the number of data to be read) */
+ while (NumDataRead > 0)
+ {
+ /* Starting from this point, if the requested number of data is higher than 1,
+ then only the DMA is managing the data transfer. Meanwhile, CPU is free to
+ perform other tasks:
+
+ // Add your code here:
+ //...
+ //...
+
+ For simplicity reasons, this example is just waiting till the end of the
+ transfer. */
+ }
+
+ /* Check if the data written to the memory is read correctly */
+ TransferStatus2 = Buffercmp(Tx2_Buffer, Rx2_Buffer, BUFFER_SIZE2);
+ /* TransferStatus2 = PASSED, if the transmitted and received data
+ to/from the EEPROM are the same */
+ /* TransferStatus2 = FAILED, if the transmitted and received data
+ to/from the EEPROM are different */
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ if (TransferStatus1 == PASSED)
+ {
+ LCD_DisplayStringLine(LCD_LINE_5, " Transfer 2 PASSED ");
+ }
+ else
+ {
+ LCD_DisplayStringLine(LCD_LINE_5, " Transfer 2 FAILED ");
+ }
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+ /* Free all used resources */
+ sEE_DeInit();
+
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ /* Display end of example information */
+ LCD_DisplayStringLine(LCD_LINE_7, "---End Of Example---");
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+ while (1)
+ {
+ }
+}
+
+#ifndef USE_DEFAULT_TIMEOUT_CALLBACK
+/**
+ * @brief Example of timeout situation management.
+ * @param None.
+ * @retval None.
+ */
+uint32_t sEE_TIMEOUT_UserCallback(void)
+{
+ /* Use application may try to recover the communication by resetting I2C
+ peripheral (calling the function I2C_SoftwareResetCmd()) then re-start
+ the transmission/reception from a previously stored recover point.
+ For simplicity reasons, this example only shows a basic way for errors
+ managements which consists of stopping all the process and requiring system
+ reset. */
+
+#ifdef ENABLE_LCD_MSG_DISPLAY
+ /* Display error message on screen */
+ LCD_Clear(LCD_COLOR_RED);
+ LCD_DisplayStringLine(LCD_LINE_4, "Communication ERROR!");
+ LCD_DisplayStringLine(LCD_LINE_5, "Try again after res-");
+ LCD_DisplayStringLine(LCD_LINE_6, " etting the Board ");
+#endif /* ENABLE_LCD_MSG_DISPLAY */
+
+ /* Block communication and all processes */
+ while (1)
+ {
+ }
+}
+
+#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */
+
+/**
+ * @brief Compares two buffers.
+ * @param pBuffer1, pBuffer2: buffers to be compared.
+ * @param BufferLength: buffer's length
+ * @retval PASSED: pBuffer1 identical to pBuffer2
+ * FAILED: pBuffer1 differs from pBuffer2
+ */
+TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
+{
+ while(BufferLength--)
+ {
+ if(*pBuffer1 != *pBuffer2)
+ {
+ return FAILED;
+ }
+
+ pBuffer1++;
+ pBuffer2++;
+ }
+
+ return PASSED;
+}
+
+#ifdef USE_FULL_ASSERT
+
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t* file, uint32_t line)
+{
+ /* User can add his own implementation to report the file name and line number,
+ ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+
+ /* Infinite loop */
+ while (1)
+ {
+ }
+}
+
+#endif
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/