diff libs/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c @ 0:c59513fd84fb

Initial commit of STM32 test code.
author Daniel O'Connor <darius@dons.net.au>
date Mon, 03 Oct 2011 21:19:15 +1030
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libs/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Examples/I2C/EEPROM/main.c	Mon Oct 03 21:19:15 2011 +1030
@@ -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****/