diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2017-01-25 22:23:13 +0100 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2017-01-25 22:23:17 +0100 |
commit | 2fff65aed2477a503c72629d27e2a330d30c02d1 (patch) | |
tree | 96fd9f2f8151e266c0cf8563a714d7bab8aa7cb0 /thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL | |
parent | 41fdd2b1f35bcb4224fdb8fee2b959e09d1f5916 (diff) | |
download | stm32f103-playground-2fff65aed2477a503c72629d27e2a330d30c02d1.tar.gz stm32f103-playground-2fff65aed2477a503c72629d27e2a330d30c02d1.tar.bz2 stm32f103-playground-2fff65aed2477a503c72629d27e2a330d30c02d1.tar.xz stm32f103-playground-2fff65aed2477a503c72629d27e2a330d30c02d1.zip |
o Seemingly working Mutexes.
o Dropping the privileged/unprivileged split for now.
Diffstat (limited to 'thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL')
7 files changed, 4079 insertions, 0 deletions
diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/Release_Notes.html b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/Release_Notes.html new file mode 100644 index 0000000..fa6098b --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/Release_Notes.html @@ -0,0 +1,146 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head> + + + + + + + + + + <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> + + + <link rel="File-List" href="Library_files/filelist.xml"> + + + <link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for STM32373C_EVAL Evaluation Board Drivers</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> + + + + + + + + <style> +<!-- +/* Style Definitions */ +p.MsoNormal, li.MsoNormal, div.MsoNormal +{mso-style-parent:""; +margin:0in; +margin-bottom:.0001pt; +mso-pagination:widow-orphan; +font-size:12.0pt; +font-family:"Times New Roman"; +mso-fareast-font-family:"Times New Roman";} +h2 +{mso-style-next:Normal; +margin-top:12.0pt; +margin-right:0in; +margin-bottom:3.0pt; +margin-left:0in; +mso-pagination:widow-orphan; +page-break-after:avoid; +mso-outline-level:2; +font-size:14.0pt; +font-family:Arial; +font-weight:bold; +font-style:italic;} +a:link, span.MsoHyperlink +{color:blue; +text-decoration:underline; +text-underline:single;} +a:visited, span.MsoHyperlinkFollowed +{color:blue; +text-decoration:underline; +text-underline:single;} +p +{mso-margin-top-alt:auto; +margin-right:0in; +mso-margin-bottom-alt:auto; +margin-left:0in; +mso-pagination:widow-orphan; +font-size:12.0pt; +font-family:"Times New Roman"; +mso-fareast-font-family:"Times New Roman";} +@page Section1 +{size:8.5in 11.0in; +margin:1.0in 1.25in 1.0in 1.25in; +mso-header-margin:.5in; +mso-footer-margin:.5in; +mso-paper-source:0;} +div.Section1 +{page:Section1;} +--> + </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> + <meta content="MCD Application Team" name="author"></head> +<body link="blue" vlink="blue"> +<div class="Section1"> +<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br> +</o:p></span></p> +<div align="center"> +<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> + <tbody> + <tr> + <td style="padding: 0cm;" valign="top"> + <table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> + <tbody> + <tr> + <td style="vertical-align: top;"> + <p class="MsoNormal"><span style="font-size: 8pt; font-family: Arial; color: blue;"><a href="../../../Release_Notes.html">Back to Release page</a><o:p></o:p></span></p> + </td> + </tr> + <tr style=""> + <td style="padding: 1.5pt;"> + <h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release +Notes for STM32373C_EVAL Evaluation Board Drivers</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1> + <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright +2012 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p> + <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../../_htmresc/logo.bmp" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p> + </td> + </tr> + </tbody> + </table> + <p class="MsoNormal"><span style="font-family: Arial; display: none;"><o:p> </o:p></span></p> + <table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900"> + <tbody> + <tr style=""> + <td style="padding: 0cm;" valign="top"> + <h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><span style="font-size: 12pt; color: white;">Contents<o:p></o:p></span></h2> + <ol style="margin-top: 0cm;" start="1" type="1"> + <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><a href="#History">STM32373C_EVAL Evaluation Board Drivers +update History</a><o:p></o:p></span></li> + <li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><a href="#License">License</a><o:p></o:p></span></li> + </ol> + <span style="font-family: "Times New Roman";"> + </span> + <h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="History"></a><span style="font-size: 12pt; color: white;">STM32373C_EVAL Evaluation Board Drivers update History</span></h2><h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 167px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V1.0.0 /20-September-2012<o:p></o:p></span></h3><p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main +Changes<o:p></o:p></span></u></b></p> +<ul style="margin-top: 0cm;" type="square"><li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"></span><span style="font-size: 10pt; font-family: Verdana;">First official release for +<span style="font-style: italic; font-weight: bold;">STM32F37x devices</span></span></li></ul><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"></span><h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="License"></a><span style="font-size: 12pt; color: white;">License<o:p></o:p></span></h2><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;">icensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this </span><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;">package</span><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"> except in compliance with the License. You may obtain a copy of the License at:<br><br></span><div style="text-align: center;"><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"> <a target="_blank" href="http://www.st.com/software_license_agreement_liberty_v2">http://www.st.com/software_license_agreement_liberty_v2</a></span><br><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"></span></div><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"><br>Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, <br>WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.</span><b><span style="font-size: 10pt; font-family: Verdana; color: black;"></span></b> + + <div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;"> + <hr align="center" size="2" width="100%"></span></div> + <span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;">For + complete documentation on </span><span style="font-size: 10pt; font-family: "Verdana","sans-serif";">STM32<span style="color: black;"> + Microcontrollers visit </span><u><span style="color: blue;"><a href="http://www.st.com/stm32f3" target="_blank">www.st.com/stm32f3</a></span></u></span><span style="font-size: 10pt; font-family: "Verdana","sans-serif";"><u><span style="color: blue;"><a href="http://www.st.com/stm32" target="_blank"></a></span></u></span><span style="font-size: 10pt; font-family: "Verdana","sans-serif";"><u><span style="color: blue;"></span></u></span><span style="font-size: 10pt; font-family: "Verdana","sans-serif";"><u><span style="color: blue;"></span></u></span><p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: Verdana;"><a target="_blank" href="http://www.st.com/internet/mcu/family/141.jsp"><u><span style="color: blue;"></span></u></a></span><span style="font-size: 10pt; font-family: Verdana;"><u><span style="color: blue;"></span></u></span><span style="color: black;"><o:p></o:p></span></p> + </td> + </tr> + </tbody> + </table> + <p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p> + </td> + </tr> + </tbody> +</table> +</div> +<p class="MsoNormal"><o:p> </o:p></p> +</div> + +</body></html>
\ No newline at end of file diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_ee.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_ee.c new file mode 100644 index 0000000..a608684 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_ee.c @@ -0,0 +1,722 @@ +/** + ****************************************************************************** + * @file stm32373c_eval_i2c_ee.c + * @author MCD Application Team + * @version V1.0.0 + * @date 20-September-2012 + * @brief This file provides a set of functions needed to manage an I2C M24LR64 + * and M24M01 EEPROM memory. + * + * =================================================================== + * Notes: + * - This driver is intended for STM32F37x families devices only. + * =================================================================== + * + * It implements a high level communication layer for read and write + * from/to this memory. The needed STM32F37x hardware resources (I2C and + * GPIO) are defined in stm32373c_eval.h file, and the initialization is + * performed in sEE_LowLevel_Init() function declared in stm32373c_eval.c + * file. + * You can easily tailor this driver to any other development board, + * by just adapting the defines for hardware resources and + * sEE_LowLevel_Init() function. + * + * @note In this driver, basic read and write functions (sEE_ReadBuffer() + * and sEE_WritePage()) use Polling mode to perform the data transfer + * to/from EEPROM memory. + * + * +-----------------------------------------------------------------+ + * | Pin assignment for M24M01 EEPROM | + * +---------------------------------------+-----------+-------------+ + * | STM32F37x I2C Pins | sEE | Pin | + * +---------------------------------------+-----------+-------------+ + * | . | NC | 1 | + * | . | E1(VDD) | 2 (3.3V) | + * | . | E2(GND) | 3 (0V) | + * | . | VSS | 4 (0V) | + * | sEE_I2C_SDA_PIN/ SDA | SDA | 5 | + * | sEE_I2C_SCL_PIN/ SCL | SCL | 6 | + * | . | /WC(VSS)| 7 (0V) | + * | . | VDD | 8 (3.3V) | + * +---------------------------------------+-----------+-------------+ + * +-----------------------------------------------------------------+ + * | Pin assignment for M24LR64 EEPROM | + * +---------------------------------------+-----------+-------------+ + * | STM32F37x I2C Pins | sEE | Pin | + * +---------------------------------------+-----------+-------------+ + * | . | E0(GND) | 1 (0V) | + * | . | AC0 | 2 | + * | . | AC1 | 3 | + * | . | VSS | 4 (0V) | + * | sEE_I2C_SDA_PIN/ SDA | SDA | 5 | + * | sEE_I2C_SCL_PIN/ SCL | SCL | 6 | + * | . | E1(GND) | 7 (0V) | + * | . | VDD | 8 (3.3V) | + * +---------------------------------------+-----------+-------------+ * + * + * * * + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32373c_eval_i2c_ee.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL_I2C_EE + * @brief This file includes the I2C EEPROM driver of STM32373C-EVAL board. + * @{ + */ + +/** @defgroup STM32373C_EVAL_I2C_EE_Private_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32373C_EVAL_I2C_EE_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32373C_EVAL_I2C_EE_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32373C_EVAL_I2C_EE_Private_Variables + * @{ + */ +__IO uint16_t sEEAddress = 0; +__IO uint32_t sEETimeout = sEE_LONG_TIMEOUT; +__IO uint16_t sEEDataNum; +/** + * @} + */ + + +/** @defgroup STM32373C_EVAL_I2C_EE_Private_Function_Prototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM32373C_EVAL_I2C_EE_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes peripherals used by the I2C EEPROM driver. + * @param None + * @retval None + */ +void sEE_DeInit(void) +{ + sEE_I2C_LowLevel_DeInit(); +} + +/** + * @brief Initializes peripherals used by the I2C EEPROM driver. + * @param None + * @retval None + */ +void sEE_Init(void) +{ + I2C_InitTypeDef I2C_InitStructure; + + sEE_I2C_LowLevel_Init(); + + /*!< I2C configuration */ + /* sEE_I2C configuration */ + I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; + I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; + I2C_InitStructure.I2C_DigitalFilter = 0x00; + I2C_InitStructure.I2C_OwnAddress1 = 0x00; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_InitStructure.I2C_Timing = sEE_I2C_TIMING; + + /* Apply sEE_I2C configuration after enabling it */ + I2C_Init(sEE_I2C, &I2C_InitStructure); + + /* sEE_I2C Peripheral Enable */ + I2C_Cmd(sEE_I2C, ENABLE); + + /*!< Select the EEPROM address */ + sEEAddress = sEE_HW_ADDRESS; +} + +/** + * @brief Reads a block of data from the EEPROM. + * @param pBuffer : pointer to the buffer that receives the data read from + * the EEPROM. + * @param ReadAddr : EEPROM's internal address to start reading from. + * @param NumByteToRead : pointer to the variable holding number of bytes to + * be read from the EEPROM. + * + * @retval sEE_OK (0) if operation is correctly performed, else return value + * different from sEE_OK (0) or the timeout user callback. + */ +uint32_t sEE_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t* NumByteToRead) +{ + uint32_t NumbOfSingle = 0, Count = 0, DataNum = 0, StartCom = 0; + + /* Get number of reload cycles */ + Count = (*NumByteToRead) / 255; + NumbOfSingle = (*NumByteToRead) % 255; + +#ifdef sEE_M24C08 + + /* Configure slave address, nbytes, reload and generate start */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Send memory address */ + I2C_SendData(sEE_I2C, (uint8_t)ReadAddr); + +#elif defined(sEE_M24M01) || defined(sEE_M24C64_32) || defined (sEE_M24LR64) + + /* Configure slave address, nbytes, reload and generate start */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 2, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Send MSB of memory address */ + I2C_SendData(sEE_I2C, (uint8_t)((ReadAddr & 0xFF00) >> 8)); + + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Send LSB of memory address */ + I2C_SendData(sEE_I2C, (uint8_t)(ReadAddr & 0x00FF)); + +#endif /*!< sEE_M24C08 */ + + /* Wait until TC flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TC) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* If number of Reload cycles is not equal to 0 */ + if (Count != 0) + { + /* Starting communication */ + StartCom = 1; + + /* Wait until all reload cycles are performed */ + while( Count != 0) + { + /* If a read transfer is performed */ + if (StartCom == 0) + { + /* Wait until TCR flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TCR) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + } + + /* if remains one read cycle */ + if ((Count == 1) && (NumbOfSingle == 0)) + { + /* if starting communication */ + if (StartCom != 0) + { + /* Configure slave address, end mode and start condition */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); + } + else + { + /* Configure slave address, end mode */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_AutoEnd_Mode, I2C_No_StartStop); + } + } + else + { + /* if starting communication */ + if (StartCom != 0) + { + /* Configure slave address, end mode and start condition */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_Reload_Mode, I2C_Generate_Start_Read); + } + else + { + /* Configure slave address, end mode */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_Reload_Mode, I2C_No_StartStop); + } + } + + /* Update local variable */ + StartCom = 0; + DataNum = 0; + + /* Wait until all data are received */ + while (DataNum != 255) + { + /* Wait until RXNE flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_RXNE) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + pBuffer[DataNum]= I2C_ReceiveData(sEE_I2C); + + /* Update number of received data */ + DataNum++; + (*NumByteToRead)--; + } + /* Update Pointer of received buffer */ + pBuffer += DataNum; + + /* update number of reload cycle */ + Count--; + } + + /* If number of single data is not equal to 0 */ + if (NumbOfSingle != 0) + { + /* Wait until TCR flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TCR) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Update CR2 : set Nbytes and end mode */ + I2C_TransferHandling(sEE_I2C, sEEAddress, (uint8_t)(NumbOfSingle), I2C_AutoEnd_Mode, I2C_No_StartStop); + + /* Reset local variable */ + DataNum = 0; + + /* Wait until all data are received */ + while (DataNum != NumbOfSingle) + { + /* Wait until RXNE flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_RXNE) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + pBuffer[DataNum]= I2C_ReceiveData(sEE_I2C); + + /* Update number of received data */ + DataNum++; + (*NumByteToRead)--; + } + } + } + else + { + /* Update CR2 : set Slave Address , set read request, generate Start and set end mode */ + I2C_TransferHandling(sEE_I2C, sEEAddress, (uint32_t)(NumbOfSingle), I2C_AutoEnd_Mode, I2C_Generate_Start_Read); + + /* Reset local variable */ + DataNum = 0; + + /* Wait until all data are received */ + while (DataNum != NumbOfSingle) + { + /* Wait until RXNE flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_RXNE) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + pBuffer[DataNum]= I2C_ReceiveData(sEE_I2C); + + /* Update number of received data */ + DataNum++; + (*NumByteToRead)--; + } + } + + /* Wait until STOPF flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_STOPF) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(sEE_I2C, I2C_ICR_STOPCF); + + /* If all operations OK, return sEE_OK (0) */ + return sEE_OK; +} + +/** + * @brief Writes more than one byte to the EEPROM with a single WRITE cycle. + * + * @note The number of bytes (combined to write start address) must not + * cross the EEPROM page boundary. This function can only write into + * the boundaries of an EEPROM page. + * This function doesn't check on boundaries condition (in this driver + * the function sEE_WriteBuffer() which calls sEE_WritePage() is + * responsible of checking on Page boundaries). + * + * @param pBuffer : pointer to the buffer containing the data to be written to + * the EEPROM. + * @param WriteAddr : EEPROM's internal address to write to. + * @param NumByteToWrite : pointer to the variable holding number of bytes to + * be written into the EEPROM. + * + * @retval sEE_OK (0) if operation is correctly performed, else return value + * different from sEE_OK (0) or the timeout user callback. + */ +uint32_t sEE_WritePage(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t* NumByteToWrite) +{ + uint32_t DataNum = 0; + +#ifdef sEE_M24C08 + + /* Configure slave address, nbytes, reload and generate start */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Send memory address */ + I2C_SendData(sEE_I2C, (uint8_t)WriteAddr); + +#elif defined(sEE_M24M01) || defined(sEE_M24C64_32) || defined (sEE_M24LR64) + + /* Configure slave address, nbytes, reload and generate start */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 2, I2C_Reload_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Send MSB of memory address */ + I2C_SendData(sEE_I2C, (uint8_t)((WriteAddr & 0xFF00) >> 8)); + + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Send LSB of memory address */ + I2C_SendData(sEE_I2C, (uint8_t)(WriteAddr & 0x00FF)); + +#endif /*!< sEE_M24C08 */ + + /* Wait until TCR flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TCR) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Update CR2 : set Slave Address , set write request, generate Start and set end mode */ + I2C_TransferHandling(sEE_I2C, sEEAddress, (uint8_t)(*NumByteToWrite), I2C_AutoEnd_Mode, I2C_No_StartStop); + + while (DataNum != (*NumByteToWrite)) + { + /* Wait until TXIS flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Write data to TXDR */ + I2C_SendData(sEE_I2C, (uint8_t)(pBuffer[DataNum])); + + /* Update number of transmitted data */ + DataNum++; + } + + /* Wait until STOPF flag is set */ + sEETimeout = sEE_LONG_TIMEOUT; + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_STOPF) == RESET) + { + if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(sEE_I2C, I2C_ICR_STOPCF); + + /* If all operations OK, return sEE_OK (0) */ + return sEE_OK; +} + +/** + * @brief Writes buffer of data to the I2C EEPROM. + * @param pBuffer : pointer to the buffer containing the data to be written + * to the EEPROM. + * @param WriteAddr : EEPROM's internal address to write to. + * @param NumByteToWrite : number of bytes to write to the EEPROM. + * @retval None + */ +void sEE_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite) +{ + uint16_t NumOfPage = 0, NumOfSingle = 0, count = 0; + uint16_t Addr = 0; + + Addr = WriteAddr % sEE_PAGESIZE; + count = sEE_PAGESIZE - Addr; + NumOfPage = NumByteToWrite / sEE_PAGESIZE; + NumOfSingle = NumByteToWrite % sEE_PAGESIZE; + + /*!< If WriteAddr is sEE_PAGESIZE aligned */ + if(Addr == 0) + { + /*!< If NumByteToWrite < sEE_PAGESIZE */ + if(NumOfPage == 0) + { + /* Store the number of data to be written */ + sEEDataNum = NumOfSingle; + /* Start writing data */ + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + } + /*!< If NumByteToWrite > sEE_PAGESIZE */ + else + { + while(NumOfPage--) + { + /* Store the number of data to be written */ + sEEDataNum = sEE_PAGESIZE; + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + WriteAddr += sEE_PAGESIZE; + pBuffer += sEE_PAGESIZE; + } + + if(NumOfSingle!=0) + { + /* Store the number of data to be written */ + sEEDataNum = NumOfSingle; + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + } + } + } + /*!< If WriteAddr is not sEE_PAGESIZE aligned */ + else + { + /*!< If NumByteToWrite < sEE_PAGESIZE */ + if(NumOfPage== 0) + { + /*!< If the number of data to be written is more than the remaining space + in the current page: */ + if (NumByteToWrite > count) + { + /* Store the number of data to be written */ + sEEDataNum = count; + /*!< Write the data contained in same page */ + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + + /* Store the number of data to be written */ + sEEDataNum = (NumByteToWrite - count); + /*!< Write the remaining data in the following page */ + sEE_WritePage((uint8_t*)(pBuffer + count), (WriteAddr + count), (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + } + else + { + /* Store the number of data to be written */ + sEEDataNum = NumOfSingle; + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + } + } + /*!< If NumByteToWrite > sEE_PAGESIZE */ + else + { + NumByteToWrite -= count; + NumOfPage = NumByteToWrite / sEE_PAGESIZE; + NumOfSingle = NumByteToWrite % sEE_PAGESIZE; + + if(count != 0) + { + /* Store the number of data to be written */ + sEEDataNum = count; + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + WriteAddr += count; + pBuffer += count; + } + + while(NumOfPage--) + { + /* Store the number of data to be written */ + sEEDataNum = sEE_PAGESIZE; + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEETimeout = sEE_LONG_TIMEOUT; + sEE_WaitEepromStandbyState(); + WriteAddr += sEE_PAGESIZE; + pBuffer += sEE_PAGESIZE; + } + if(NumOfSingle != 0) + { + /* Store the number of data to be written */ + sEEDataNum = NumOfSingle; + sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); + sEE_WaitEepromStandbyState(); + } + } + } +} + +/** + * @brief Wait for EEPROM Standby state. + * + * @note This function allows to wait and check that EEPROM has finished the + * last operation. It is mostly used after Write operation: after receiving + * the buffer to be written, the EEPROM may need additional time to actually + * perform the write operation. During this time, it doesn't answer to + * I2C packets addressed to it. Once the write operation is complete + * the EEPROM responds to its address. + * + * @param None + * + * @retval sEE_OK (0) if operation is correctly performed, else return value + * different from sEE_OK (0) or the timeout user callback. + */ +uint32_t sEE_WaitEepromStandbyState(void) +{ + __IO uint32_t sEETrials = 0; + + /* Keep looping till the slave acknowledge his address or maximum number + of trials is reached (this number is defined by sEE_MAX_TRIALS_NUMBER define + in stm32373c_eval_i2c_ee.h file) */ + + /* Configure CR2 register : set Slave Address and end mode */ + I2C_TransferHandling(sEE_I2C, sEEAddress, 0, I2C_AutoEnd_Mode, I2C_No_StartStop); + + do + { + /* Initialize sEETimeout */ + sEETimeout = sEE_FLAG_TIMEOUT; + + /* Clear NACKF */ + I2C_ClearFlag(sEE_I2C, I2C_ICR_NACKCF | I2C_ICR_STOPCF); + + /* Generate start */ + I2C_GenerateSTART(sEE_I2C, ENABLE); + + /* Wait until timeout elapsed */ + while (sEETimeout-- != 0); + + /* Check if the maximum allowed numbe of trials has bee reached */ + if (sEETrials++ == sEE_MAX_TRIALS_NUMBER) + { + /* If the maximum number of trials has been reached, exit the function */ + return sEE_TIMEOUT_UserCallback(); + } + } + while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_NACKF) != RESET); + + /* Clear STOPF */ + I2C_ClearFlag(sEE_I2C, I2C_ICR_STOPCF); + + /* Return sEE_OK if device is ready */ + return sEE_OK; +} + +#ifdef USE_DEFAULT_TIMEOUT_CALLBACK +/** + * @brief Basic management of the timeout situation. + * @param None. + * @retval None. + */ +uint32_t sEE_TIMEOUT_UserCallback(void) +{ + return 0; +} +#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_ee.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_ee.h new file mode 100644 index 0000000..93c7f3b --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_ee.h @@ -0,0 +1,208 @@ +/** + ****************************************************************************** + * @file stm32373c_eval_i2c_ee.h + * @author MCD Application Team + * @version V1.0.0 + * @date 20-September-2012 + * @brief This file contains all the functions prototypes for + * the stm32373c_eval_i2c_ee.c firmware driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32373C_EVAL_I2C_EE_H +#define __STM32373C_EVAL_I2C_EE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32373c_eval.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL_I2C_EE + * @{ + */ + +/** @defgroup STM32373C_EVAL_I2C_EE_Exported_Types + * @{ + */ + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_EE_Exported_Constants + * @{ + */ + +/* Select which EEPROM will be used with this driver */ +#define sEE_M24LR64 +/*#define sEE_M24M01*/ + +/* Uncomment the following line to use the default sEE_TIMEOUT_UserCallback() + function implemented in stm32373c_eval_i2c_ee.c file. + sEE_TIMEOUT_UserCallback() function is called whenever a timeout condition + occure during communication (waiting on an event that doesn't occur, bus + errors, busy devices ...). */ +/* #define USE_DEFAULT_TIMEOUT_CALLBACK */ + +#if !defined (sEE_M24C08) && !defined (sEE_M24C64_32) && !defined (sEE_M24LR64) && !defined (sEE_M24M01) +/* Use the defines below the choose the EEPROM type */ +#define sEE_M24M01 /* Support the device: M24M01. */ +/* #define sEE_M24C08*/ /* Support the device: M24C08. */ +/* note: Could support: M24C01, M24C02, M24C04 and M24C16 if the blocks and + HW address are correctly defined*/ +/*#define sEE_M24C64_32*/ /* Support the devices: M24C32 and M24C64 */ +/*#define sEE_M24LR64*/ /*Support the devices: M24LR64 */ +#endif + +#ifdef sEE_M24C64_32 +/* For M24C32 and M24C64 devices, E0,E1 and E2 pins are all used for device + address selection (ne need for additional address lines). According to the + Harware connection on the board. */ + + #define sEE_HW_ADDRESS 0xA0 /* E0 = E1 = E2 = 0 */ + +#elif defined (sEE_M24C08) +/* The M24C08W contains 4 blocks (128byte each) with the adresses below: E2 = 0 + EEPROM Addresses defines */ + #define sEE_HW_ADDRESS 0xA0 /* E2 = 0 */ + /*#define sEE_HW_ADDRESS 0xA2*/ /* E2 = 0 */ + /*#define sEE_HW_ADDRESS 0xA4*/ /* E2 = 0 */ + /*#define sEE_HW_ADDRESS 0xA6*/ /* E2 = 0 */ + +#elif defined (sEE_M24LR64) + #define sEE_HW_ADDRESS 0xA0 + +#elif defined (sEE_M24M01) +/* The sEE_M24M01 contains 2 blocks (64Kbytes each) with the adresses below + EEPROM Addresses defines */ + #define sEE_HW_ADDRESS 0xA4 /* Block 1 : E1= 1; E2 = 0; A16 = 0 */ + /*#define sEE_HW_ADDRESS 0xA6*/ /* Block 2 : E1= 1; E2 = 0; A16 = 1 */ + +#endif /* sEE_M24C64_32 */ + +/* I2C TIMING Register define when I2C clock source is SYSCLK */ +/* I2C TIMING is calculated in case of the I2C Clock source is the SYSCLK = 72 MHz */ +#ifdef sEE_M24M01 + /* When using sEE_M24M01 set TIMING to 0x00C4092A to reach 1 MHz speed (Rise time = 26ns, Fall time = 2ns) */ + #define sEE_I2C_TIMING 0x00C4092A +#elif defined (sEE_M24LR64) + /* When using sEE_M24LR64 set TIMING to 0xC062121F to reach 100 KHz speed (Rise time = 640ns, Fall time = 20ns) */ + #define sEE_I2C_TIMING 0xC062121F +#endif /* sEE_M24M01 */ + +#if defined (sEE_M24C08) + #define sEE_PAGESIZE 16 +#elif defined (sEE_M24C64_32) + #define sEE_PAGESIZE 32 +#elif defined (sEE_M24LR64) + #define sEE_PAGESIZE 4 +#elif defined (sEE_M24M01) + #define sEE_PAGESIZE 128 +#endif + +/* Maximum Timeout values for flags and events waiting loops. These timeouts are + not based on accurate values, they just guarantee that the application will + not remain stuck if the I2C communication is corrupted. + You may modify these timeout values depending on CPU frequency and application + conditions (interrupts routines ...). */ +#define sEE_FLAG_TIMEOUT ((uint32_t)0x1000) +#define sEE_LONG_TIMEOUT ((uint32_t)(10 * sEE_FLAG_TIMEOUT)) + +/* Maximum number of trials for sEE_WaitEepromStandbyState() function */ +#define sEE_MAX_TRIALS_NUMBER 300 + +#define sEE_OK 0 +#define sEE_FAIL 1 + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_EE_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_EE_Exported_Functions + * @{ + */ +void sEE_DeInit(void); +void sEE_Init(void); +uint32_t sEE_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t* NumByteToRead); +uint32_t sEE_WritePage(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t* NumByteToWrite); +void sEE_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite); +uint32_t sEE_WaitEepromStandbyState(void); + +/* USER Callbacks: These are functions for which prototypes only are declared in + EEPROM driver and that should be implemented into user applicaiton. */ +/* sEE_TIMEOUT_UserCallback() function is called whenever a timeout condition + occure during communication (waiting on an event that doesn't occur, bus + errors, busy devices ...). + You can use the default timeout callback implementation by uncommenting the + define USE_DEFAULT_TIMEOUT_CALLBACK in stm32373c_eval_i2c_ee.h file. + Typically the user implementation of this callback should reset I2C peripheral + and re-initialize communication or in worst case reset all the application. */ +uint32_t sEE_TIMEOUT_UserCallback(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32373C_EVAL_I2C_EE_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_tsensor.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_tsensor.c new file mode 100644 index 0000000..5661aab --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_tsensor.c @@ -0,0 +1,714 @@ +/** + ****************************************************************************** + * @file stm32373c_eval_i2c_tsensor.c + * @author MCD Application Team + * @version V1.0.0 + * @date 20-September-2012 + * @brief This file provides a set of functions needed to manage the I2C LM75 + * temperature sensor mounted on STM32373C-EVAL board . + * It implements a high level communication layer for read and write + * from/to this sensor. The needed STM32F37x hardware resources (I2C and + * GPIO) are defined in stm32373c_eval.h file, and the initialization is + * performed in LM75_LowLevel_Init() function declared in stm32373c_eval.c + * file. + * You can easily tailor this driver to any other development board, + * by just adapting the defines for hardware resources and + * LM75_LowLevel_Init() function. + * + * +-----------------------------------------------------------------+ + * | Pin assignment | + * +---------------------------------------+-----------+-------------+ + * | STM32F37x I2C Pins | STLM75 | Pin | + * +---------------------------------------+-----------+-------------+ + * | LM75_I2C_SDA_PIN/ SDA | SDA | 1 | + * | LM75_I2C_SCL_PIN/ SCL | SCL | 2 | + * | LM75_I2C_SMBUSALERT_PIN/ SMBUS ALERT | OS/INT | 3 | + * | . | GND | 4 (0V) | + * | . | GND | 5 (0V) | + * | . | GND | 6 (0V) | + * | . | GND | 7 (0V) | + * | . | VDD | 8 (3.3V)| + * +---------------------------------------+-----------+-------------+ + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32373c_eval_i2c_tsensor.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32373C_EVAL + * @{ + */ + +/** @addtogroup Common + * @{ + */ + +/** @addtogroup STM32373C_EVAL_I2C_TSENSOR + * @brief This file includes the LM75 Temperature Sensor driver of + * STM32373C-EVAL boards. + * @{ + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Private_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Private_Defines + * @{ + */ +#define LM75_SD_SET 0x01 /*!< Set SD bit in the configuration register */ +#define LM75_SD_RESET 0xFE /*!< Reset SD bit in the configuration register */ +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Private_Variables + * @{ + */ + +__IO uint32_t LM75_Timeout = LM75_LONG_TIMEOUT; +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Private_Function_Prototypes + * @{ + */ + +/** + * @} + */ + + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes the LM75_I2C. + * @param None + * @retval None + */ +void LM75_DeInit(void) +{ + LM75_LowLevel_DeInit(); +} + +/** + * @brief Initializes the LM75_I2C. + * @param None + * @retval None + */ +void LM75_Init(void) +{ + I2C_InitTypeDef I2C_InitStructure; + + LM75_LowLevel_Init(); + + /* LM75_I2C configuration */ + I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost; + I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; + I2C_InitStructure.I2C_DigitalFilter = 0x00; + I2C_InitStructure.I2C_OwnAddress1 = 0x00; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_InitStructure.I2C_Timing = LM75_I2C_TIMING; + + /* Apply LM75_I2C configuration after enabling it */ + I2C_Init(LM75_I2C, &I2C_InitStructure); + + /* LM75_I2C Peripheral Enable */ + I2C_Cmd(LM75_I2C, ENABLE); +} + +/** + * @brief Checks the LM75 status. + * @param None + * @retval ErrorStatus: LM75 Status (ERROR or SUCCESS). + */ +ErrorStatus LM75_GetStatus(void) +{ + uint32_t I2C_TimeOut = I2C_TIMEOUT; + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 0, I2C_AutoEnd_Mode, I2C_No_StartStop); + + /* Clear NACKF and STOPF */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_NACKCF | I2C_ICR_STOPCF); + + /* Generate start */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Wait until timeout elapsed */ + while ((I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) && (I2C_TimeOut-- != 0)); + + /* Check if Temp sensor is ready for use */ + if ((I2C_GetFlagStatus(LM75_I2C, I2C_ISR_NACKF) != RESET) || (I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) || + (I2C_GetFlagStatus(LM75_I2C, I2C_ISR_ARLO) != RESET) || (I2C_TimeOut == 0)) + { + /* Clear NACKF, BUSY, ARLO and STOPF */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_NACKCF | I2C_ISR_BUSY | I2C_ISR_ARLO| I2C_ICR_STOPCF); + + return ERROR; + } + else + { + /* Clear STOPF */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + return SUCCESS; + } +} + +/** + * @brief Read the specified register from the LM75. + * @param RegName: specifies the LM75 register to be read. + * This member can be one of the following values: + * - LM75_REG_TEMP: temperature register + * - LM75_REG_TOS: Over-limit temperature register + * - LM75_REG_THYS: Hysteresis temperature register + * @retval LM75 register value. + */ +uint16_t LM75_ReadReg(uint8_t RegName) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + uint16_t tmp = 0; + uint32_t DataNum = 0; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)RegName); + + /* Wait until TC flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TC) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 2, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); + + /* Reset local variable */ + DataNum = 0; + + /* Wait until all data are received */ + while (DataNum != 2) + { + /* Wait until RXNE flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_RXNE) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + LM75_BufferRX[DataNum]= I2C_ReceiveData(LM75_I2C); + + /* Update number of received data */ + DataNum++; + } + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + /*!< Store LM75_I2C received data */ + tmp = (uint16_t)(LM75_BufferRX[0] << 8); + tmp |= LM75_BufferRX[1]; + + /* return a Reg value */ + return (uint16_t)tmp; +} + +/** + * @brief Write to the specified register of the LM75. + * @param RegName: specifies the LM75 register to be written. + * This member can be one of the following values: + * - LM75_REG_TOS: Over-limit temperature register + * - LM75_REG_THYS: Hysteresis temperature register + * @param RegValue: value to be written to LM75 register. + * @retval None + */ +uint8_t LM75_WriteReg(uint8_t RegName, uint16_t RegValue) +{ + uint32_t DataNum = 0; + uint8_t LM75_BufferTX[2] ={0,0}; + + LM75_BufferTX[0] = (uint8_t)(RegValue >> 8); + LM75_BufferTX[1] = (uint8_t)(RegValue); + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)RegName); + + /* Wait until TCR flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TCR) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 2, I2C_AutoEnd_Mode, I2C_No_StartStop); + + while (DataNum != 2) + { + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Write data to TXDR */ + I2C_SendData(LM75_I2C, (uint8_t)(LM75_BufferTX[DataNum])); + + /* Update number of transmitted data */ + DataNum++; + } + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + return LM75_OK; +} + +/** + * @brief Read Temperature register of LM75: double temperature value. + * @param None + * @retval LM75 measured temperature value. + */ +uint16_t LM75_ReadTemp(void) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + uint16_t tmp = 0; + uint32_t DataNum = 0; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_REG_TEMP); + + /* Wait until TC flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TC) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 2, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); + + /* Reset local variable */ + DataNum = 0; + + /* Wait until all data are received */ + while (DataNum != 2) + { + /* Wait until RXNE flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_RXNE) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + LM75_BufferRX[DataNum]= I2C_ReceiveData(LM75_I2C); + + /* Update number of received data */ + DataNum++; + } + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + /*!< Store LM75_I2C received data */ + tmp = (uint16_t)(LM75_BufferRX[0] << 8); + tmp |= LM75_BufferRX[1]; + + /*!< Return Temperature value */ + return (uint16_t)(tmp >> 7); +} + +/** + * @brief Read the configuration register from the LM75. + * @param None + * @retval LM75 configuration register value. + */ +uint8_t LM75_ReadConfReg(void) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_REG_CONF); + + /* Wait until TC flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TC) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); + + /* Wait until RXNE flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_RXNE) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + LM75_BufferRX[0]= I2C_ReceiveData(LM75_I2C); + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + /*!< Return Register value */ + return (uint8_t)LM75_BufferRX[0]; +} + +/** + * @brief Write to the configuration register of the LM75. + * @param RegValue: specifies the value to be written to LM75 configuration + * register. + * @retval None + */ +uint8_t LM75_WriteConfReg(uint8_t RegValue) +{ + uint8_t LM75_BufferTX = 0; + + LM75_BufferTX = (uint8_t)(RegValue); + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_REG_CONF); + + /* Wait until TCR flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TCR) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_AutoEnd_Mode, I2C_No_StartStop); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Write data to TXDR */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_BufferTX); + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + return LM75_OK; +} + +/** + * @brief Enables or disables the LM75. + * @param NewState: specifies the LM75 new status. This parameter can be ENABLE + * or DISABLE. + * @retval None + */ +uint8_t LM75_ShutDown(FunctionalState NewState) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + uint8_t LM75_BufferTX = 0; + __IO uint8_t RegValue = 0; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_REG_CONF); + + /* Wait until TC flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TC) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); + + /* Wait until RXNE flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_RXNE) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Read data from RXDR */ + LM75_BufferRX[0]= I2C_ReceiveData(LM75_I2C); + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + /*!< Get received data */ + RegValue = (uint8_t)LM75_BufferRX[0]; + + /*---------------------------- Transmission Phase ---------------------------*/ + + /*!< Enable or disable SD bit */ + if (NewState != DISABLE) + { + /*!< Enable LM75 */ + LM75_BufferTX = RegValue & LM75_SD_RESET; + } + else + { + /*!< Disable LM75 */ + LM75_BufferTX = RegValue | LM75_SD_SET; + } + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_BUSY) != RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send Register address */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_REG_CONF); + + /* Wait until TCR flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TCR) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure slave address, nbytes, reload, end mode and start or stop generation */ + I2C_TransferHandling(LM75_I2C, LM75_ADDR, 1, I2C_AutoEnd_Mode, I2C_No_StartStop); + + /* Wait until TXIS flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_TXIS) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Write data to TXDR */ + I2C_SendData(LM75_I2C, (uint8_t)LM75_BufferTX); + + /* Wait until STOPF flag is set */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while(I2C_GetFlagStatus(LM75_I2C, I2C_ISR_STOPF) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Clear STOPF flag */ + I2C_ClearFlag(LM75_I2C, I2C_ICR_STOPCF); + + return LM75_OK; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_tsensor.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_tsensor.h new file mode 100644 index 0000000..5f51580 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_i2c_tsensor.h @@ -0,0 +1,175 @@ +/** + ****************************************************************************** + * @file stm32373c_eval_i2c_tsensor.h + * @author MCD Application Team + * @version V1.0.0 + * @date 20-September-2012 + * @brief This file contains all the functions prototypes for the + * stm32373c_eval_i2c_tsensor.c firmware driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32373C_EVAL_I2C_TSENSOR_H +#define __STM32373C_EVAL_I2C_TSENSOR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32373c_eval.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32373C_EVAL + * @{ + */ + +/** @addtogroup Common + * @{ + */ + +/** @addtogroup STM32373C_EVAL_I2C_TSENSOR + * @{ + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Exported_Types + * @{ + */ + +/** + * @brief TSENSOR Status + */ +typedef enum +{ + LM75_OK = 0, + LM75_FAIL +}LM75_Status_TypDef; + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Exported_Constants + * @{ + */ + +/* Uncomment the following line to use Timeout_User_Callback LM75_TimeoutUserCallback(). + If This Callback is enabled, it should be implemented by user in main function . + LM75_TimeoutUserCallback() function is called whenever a timeout condition + occure during communication (waiting on an event that doesn't occur, bus + errors, busy devices ...). */ +/*#define USE_TIMEOUT_USER_CALLBACK*/ + +/* Maximum Timeout values for flags and events waiting loops. These timeouts are + not based on accurate values, they just guarantee that the application will + not remain stuck if the I2C communication is corrupted. + You may modify these timeout values depending on CPU frequency and application + conditions (interrupts routines ...). */ +#define LM75_FLAG_TIMEOUT ((uint32_t)0x1000) +#define LM75_LONG_TIMEOUT ((uint32_t)(10 * LM75_FLAG_TIMEOUT)) + + +/** + * @brief Block Size + */ +#define LM75_REG_TEMP 0x00 /*!< Temperature Register of LM75 */ +#define LM75_REG_CONF 0x01 /*!< Configuration Register of LM75 */ +#define LM75_REG_THYS 0x02 /*!< Temperature Register of LM75 */ +#define LM75_REG_TOS 0x03 /*!< Over-temp Shutdown threshold Register of LM75 */ +#define I2C_TIMEOUT ((uint32_t)0x3FFFF) /*!< I2C Time out */ +#define LM75_ADDR 0x90 /*!< LM75 address */ + + +/* I2C TIMING Register define when I2C clock source is SYSCLK */ +/* I2C TIMING is calculated in case of the I2C Clock source is the SYSCLK = 72 MHz */ +/* set TIMING to 0xC062121F to reach 100 KHz speed (Rise time = 640ns, Fall time = 20ns) */ + +#define LM75_I2C_TIMING 0xC062121F + + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_I2C_TSENSOR_Exported_Functions + * @{ + */ +void LM75_DeInit(void); +void LM75_Init(void); +ErrorStatus LM75_GetStatus(void); +uint16_t LM75_ReadTemp(void); +uint16_t LM75_ReadReg(uint8_t RegName); +uint8_t LM75_WriteReg(uint8_t RegName, uint16_t RegValue); +uint8_t LM75_ReadConfReg(void); +uint8_t LM75_WriteConfReg(uint8_t RegValue); +uint8_t LM75_ShutDown(FunctionalState NewState); + +/** + * @brief Timeout user callback function. This function is called when a timeout + * condition occurs during communication with LM75. Only protoype + * of this function is decalred in LM75 driver. Its implementation + * may be done into user application. This function may typically stop + * current operations and reset the I2C peripheral and LM75. + * To enable this function use uncomment the define USE_TIMEOUT_USER_CALLBACK + * at the top of this file. + */ +#ifdef USE_TIMEOUT_USER_CALLBACK + uint8_t LM75_TIMEOUT_UserCallback(void); +#else + #define LM75_TIMEOUT_UserCallback() LM75_FAIL +#endif /* USE_TIMEOUT_USER_CALLBACK */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32373C_EVAL_I2C_TSENSOR_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_lcd.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_lcd.c new file mode 100644 index 0000000..a24bc9a --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_lcd.c @@ -0,0 +1,1694 @@ +/** + ****************************************************************************** + * @file stm32373C_eval_lcd.c + * @author MCD Application Team + * @version V1.0.0 + * @date 20-September-2012 + * @brief This file includes the LCD driver for MR028-9325-51P(ILI9328) + * and MRE028-8347G-51P(HX8347G) Display Modules of STM32373C-EVAL. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32373C_eval_lcd.h" +#include "../Common/fonts.c" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL + * @{ + */ + +/** @defgroup STM32373C_EVAL_LCD + * @brief This file includes the LCD driver for MR028-9325-51P(ILI9328) + * and MRE028-8347G-51P(HX8347G) Liquid Crystal Display Module of + * STM32373C-EVAL board. + * @{ + */ + +/** @defgroup STM32373C_EVAL_LCD_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Private_Defines + * @{ + */ + +#define START_BYTE 0x70 +#define SET_INDEX 0x00 +#define READ_STATUS 0x01 +#define LCD_WRITE_REG 0x02 +#define LCD_READ_REG 0x03 +#define MAX_POLY_CORNERS 200 +#define POLY_Y(Z) ((int32_t)((Points + Z)->X)) +#define POLY_X(Z) ((int32_t)((Points + Z)->Y)) +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Private_Macros + * @{ + */ +#define ABS(X) ((X) > 0 ? (X) : -(X)) +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Private_Variables + * @{ + */ +static sFONT *LCD_Currentfonts; +/* Global variables to set the written text color */ +static __IO uint16_t TextColor = 0x0000, BackColor = 0xFFFF; +uint16_t LCDType = 0; +static uint8_t StartX = 0; +static uint32_t StartY = 0; +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Private_FunctionPrototypes + * @{ + */ +#ifndef USE_Delay +static void delay(__IO uint32_t nCount); +#endif /* USE_Delay*/ + +static void PutPixel(int16_t x, int16_t y); +static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed); + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes the LCD. + * @param None + * @retval None + */ +void LCD_DeInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /*!< LCD Display Off */ + LCD_DisplayOff(); + + /*!< LCD_SPI disable */ + SPI_Cmd(LCD_SPI, DISABLE); + + /*!< LCD_SPI DeInit */ + SPI_I2S_DeInit(LCD_SPI); + + /*!< Disable SPI clock */ + RCC_APB1PeriphClockCmd(LCD_SPI_CLK, DISABLE); + + /* Configure NCS in Output Push-Pull mode */ + GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure); + + /* Configure SPI pins: SCK, MISO and MOSI */ + GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN; + GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN; + GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN; + GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); +} + +/** + * @brief Initializes the LCD. + * @param None + * @retval None + */ +void STM32373C_LCD_Init(void) +{ + /* Configure the LCD Control pins --------------------------------------------*/ + LCD_CtrlLinesConfig(); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); + + /* Configure the LCD_SPI interface -------------------------------------------*/ + LCD_SPIConfig(); + + /* Read LCD controller ID */ + LCDType = LCD_ReadReg(LCD_REG_0); + /* Delay 50 ms */ + _delay_(5); + + if(LCDType == LCD_HX8347G) + { + /* Driving ability setting */ + LCD_WriteReg(LCD_REG_234, 0x00); + LCD_WriteReg(LCD_REG_235, 0x20); + LCD_WriteReg(LCD_REG_236, 0x0C); + LCD_WriteReg(LCD_REG_237, 0xC4); + LCD_WriteReg(LCD_REG_232, 0x40); + LCD_WriteReg(LCD_REG_233, 0x38); + LCD_WriteReg(LCD_REG_241, 0x01); + LCD_WriteReg(LCD_REG_242, 0x10); + LCD_WriteReg(LCD_REG_39, 0xA3); + + /* Adjust the Gamma Curve */ + LCD_WriteReg(LCD_REG_64, 0x01); + LCD_WriteReg(LCD_REG_65, 0x00); + LCD_WriteReg(LCD_REG_66, 0x00); + LCD_WriteReg(LCD_REG_67, 0x10); + LCD_WriteReg(LCD_REG_68, 0x0E); + LCD_WriteReg(LCD_REG_69, 0x24); + LCD_WriteReg(LCD_REG_70, 0x04); + LCD_WriteReg(LCD_REG_71, 0x50); + LCD_WriteReg(LCD_REG_72, 0x02); + LCD_WriteReg(LCD_REG_73, 0x13); + LCD_WriteReg(LCD_REG_74, 0x19); + LCD_WriteReg(LCD_REG_75, 0x19); + LCD_WriteReg(LCD_REG_76, 0x16); + LCD_WriteReg(LCD_REG_80, 0x1B); + LCD_WriteReg(LCD_REG_81, 0x31); + LCD_WriteReg(LCD_REG_82, 0x2F); + LCD_WriteReg(LCD_REG_83, 0x3F); + LCD_WriteReg(LCD_REG_84, 0x3F); + LCD_WriteReg(LCD_REG_85, 0x3E); + LCD_WriteReg(LCD_REG_86, 0x2F); + LCD_WriteReg(LCD_REG_87, 0x7B); + LCD_WriteReg(LCD_REG_88, 0x09); + LCD_WriteReg(LCD_REG_89, 0x06); + LCD_WriteReg(LCD_REG_90, 0x06); + LCD_WriteReg(LCD_REG_91, 0x0C); + LCD_WriteReg(LCD_REG_92, 0x1D); + LCD_WriteReg(LCD_REG_93, 0xCC); + + /* Power voltage setting */ + LCD_WriteReg(LCD_REG_27, 0x1B); + LCD_WriteReg(LCD_REG_26, 0x01); + LCD_WriteReg(LCD_REG_36, 0x2F); + LCD_WriteReg(LCD_REG_37, 0x57); + /*****VCOM offset ****/ + LCD_WriteReg(LCD_REG_35, 0x86); + + /* Power on setting up flow */ + LCD_WriteReg(LCD_REG_24, 0x36); /* Display frame rate = 70Hz RADJ = '0110' */ + LCD_WriteReg(LCD_REG_25, 0x01); /* OSC_EN = 1 */ + LCD_WriteReg(LCD_REG_28, 0x06); /* AP[2:0] = 111 */ + LCD_WriteReg(LCD_REG_29, 0x06); /* AP[2:0] = 111 */ + LCD_WriteReg(LCD_REG_31,0x90); /* GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0*/ + LCD_WriteReg(LCD_REG_39, 1); /* REF = 1 */ + _delay_(10); + + /* 262k/65k color selection */ + LCD_WriteReg(LCD_REG_23, 0x05); /* default 0x06 262k color, 0x05 65k color */ + /* SET PANEL */ + LCD_WriteReg(LCD_REG_54, 0x09); /* SS_PANEL = 1, GS_PANEL = 0,REV_PANEL = 0, BGR_PANEL = 1 */ + + /* Display ON flow */ + LCD_WriteReg(LCD_REG_40, 0x38); /* GON=1, DTE=1, D=10 */ + _delay_(60); + LCD_WriteReg(LCD_REG_40, 0x3C); /* GON=1, DTE=1, D=11 */ + + /* Set GRAM Area - Partial Display Control */ + LCD_WriteReg(LCD_REG_1, 0x00); /* DP_STB = 0, DP_STB_S = 0, SCROLL = 0, */ + LCD_WriteReg(LCD_REG_2, 0x00); /* Column address start 2 */ + LCD_WriteReg(LCD_REG_3, 0x00); /* Column address start 1 */ + LCD_WriteReg(LCD_REG_4, 0x01); /* Column address end 2 */ + LCD_WriteReg(LCD_REG_5, 0x3F); /* Column address end 1 */ + LCD_WriteReg(LCD_REG_6, 0x00); /* Row address start 2 */ + LCD_WriteReg(LCD_REG_7, 0x00); /* Row address start 2 */ + LCD_WriteReg(LCD_REG_8, 0x00); /* Row address end 2 */ + LCD_WriteReg(LCD_REG_9, 0xEF); /* Row address end 1 */ + LCD_WriteReg(LCD_REG_22, 0xA0); /* Memory access control: MY = 1, MX = 0, MV = 1, ML = 0 */ + } + else + { + /* Start Initial Sequence ------------------------------------------------*/ + LCD_WriteReg(LCD_REG_0, 0x0001); /* Start internal OSC. */ + LCD_WriteReg(LCD_REG_1, 0x0100); /* set SS and SM bit */ + LCD_WriteReg(LCD_REG_2, 0x0700); /* set 1 line inversion */ + LCD_WriteReg(LCD_REG_3, 0x1018); /* set GRAM write direction and BGR=1. */ + LCD_WriteReg(LCD_REG_4, 0x0000); /* Resize register */ + + LCD_WriteReg(LCD_REG_8, 0x0302); /* set the back porch and front porch */ + LCD_WriteReg(LCD_REG_9, 0x0000); /* set non-display area refresh cycle ISC[3:0] */ + LCD_WriteReg(LCD_REG_10, 0x0000); /* FMARK function */ + + LCD_WriteReg(LCD_REG_12, 0x0000); /* RGB interface setting */ + LCD_WriteReg(LCD_REG_13, 0x0000); /* Frame marker Position */ + LCD_WriteReg(LCD_REG_15, 0x0000); /* RGB interface polarity */ + + /* Power On sequence -----------------------------------------------------*/ + LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ + LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */ + _delay_(20); /* Dis-charge capacitor power voltage (200ms) */ + LCD_WriteReg(LCD_REG_16, 0x14B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_17, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_18, 0x0018); /* VREG1OUT voltage */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_19, 0x1000); /* VDV[4:0] for VCOM amplitude */ + LCD_WriteReg(LCD_REG_41, 0x0015); /* VCM[4:0] for VCOMH */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_32, 0x0000); /* GRAM horizontal Address */ + LCD_WriteReg(LCD_REG_33, 0x0000); /* GRAM Vertical Address */ + _delay_(50); + + /* Adjust the Gamma Curve ------------------------------------------------*/ + LCD_WriteReg(LCD_REG_48, 0x0000); + LCD_WriteReg(LCD_REG_49, 0x0107); + LCD_WriteReg(LCD_REG_50, 0x0000); + LCD_WriteReg(LCD_REG_53, 0x0203); + + LCD_WriteReg(LCD_REG_54, 0x0402); + + LCD_WriteReg(LCD_REG_55, 0x0000); + LCD_WriteReg(LCD_REG_56, 0x0207); + LCD_WriteReg(LCD_REG_57, 0x0000); + LCD_WriteReg(LCD_REG_60, 0x0203); + LCD_WriteReg(LCD_REG_61, 0x0403); + + /* Set GRAM area ---------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_80, 0x0000); /* Horizontal GRAM Start Address */ + LCD_WriteReg(LCD_REG_81, 0x00EF); /* Horizontal GRAM End Address */ + LCD_WriteReg(LCD_REG_82, 0x0000); /* Vertical GRAM Start Address */ + LCD_WriteReg(LCD_REG_83, 0x013F); /* Vertical GRAM End Address */ + LCD_WriteReg(LCD_REG_96, 0xA700); /* Gate Scan Line */ + LCD_WriteReg(LCD_REG_97, 0x0003); /* NDL,VLE, REV */ + LCD_WriteReg(LCD_REG_106, 0x0000); /* set scrolling line */ + + /* Partial Display Control -----------------------------------------------*/ + LCD_WriteReg(LCD_REG_128, 0x0000); + LCD_WriteReg(LCD_REG_129, 0x0000); + LCD_WriteReg(LCD_REG_130, 0x0000); + LCD_WriteReg(LCD_REG_131, 0x0000); + LCD_WriteReg(LCD_REG_132, 0x0000); + LCD_WriteReg(LCD_REG_133, 0x0000); + + /* Panel Control ---------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_144, 0x0010); + LCD_WriteReg(LCD_REG_146, 0x0000); + LCD_WriteReg(LCD_REG_147, 0x0003); + LCD_WriteReg(LCD_REG_149, 0x0110); + LCD_WriteReg(LCD_REG_151, 0x0000); + LCD_WriteReg(LCD_REG_152, 0x0000); + /* Set GRAM write direction and BGR = 1 */ + /* I/D=01 (Horizontal : increment, Vertical : decrement) */ + /* AM=1 (address is updated in vertical writing direction) */ + LCD_WriteReg(LCD_REG_3, 0x1018); + LCD_WriteReg(LCD_REG_7, 0x0133); /* 262K color and display ON */ + } + + /* Set default font */ + LCD_SetFont(&LCD_DEFAULT_FONT); +} + +/** + * @brief Swap the display direction. This is useful when displaying bmp files. + * @param None. + * @retval None + */ +void LCD_SwapDirection(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + if(LCDType == LCD_HX8347G) + { + /* Memory access control: MY = 1, MX = 1, MV = 1, ML = 0 */ + LCD_WriteReg(LCD_REG_22, 0xE0); + } + else + { + /* Set GRAM write direction and BGR = 1 */ + /* I/D=00 (Horizontal : decrement, Vertical : decrement) */ + /* AM=1 (address is updated in vertical writing direction) */ + LCD_WriteReg(LCD_REG_3, 0x1008); + } + } + else + { + if(LCDType == LCD_HX8347G) + { + /* Memory access control: MY = 1, MX = 0, MV = 1, ML = 0 */ + LCD_WriteReg(LCD_REG_22, 0xA0); + } + else + { + /* Set GRAM write direction and BGR = 1 */ + /* I/D=00 (Horizontal : decrement, Vertical : decrement) */ + /* AM=1 (address is updated in vertical writing direction) */ + LCD_WriteReg(LCD_REG_3, 0x1018); + } + } +} + +/** + * @brief Sets the LCD Text and Background colors. + * @param _TextColor: specifies the Text Color. + * @param _BackColor: specifies the Background Color. + * @retval None + */ +void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor) +{ + TextColor = _TextColor; + BackColor = _BackColor; +} + +/** + * @brief Gets the LCD Text and Background colors. + * @param _TextColor: pointer to the variable that will contain the Text + Color. + * @param _BackColor: pointer to the variable that will contain the Background + Color. + * @retval None + */ +void LCD_GetColors(__IO uint16_t *_TextColor, __IO uint16_t *_BackColor) +{ + *_TextColor = TextColor; *_BackColor = BackColor; +} + +/** + * @brief Sets the Text color. + * @param Color: specifies the Text color code RGB(5-6-5). + * @retval None + */ +void LCD_SetTextColor(__IO uint16_t Color) +{ + TextColor = Color; +} + + +/** + * @brief Sets the Background color. + * @param Color: specifies the Background color code RGB(5-6-5). + * @retval None + */ +void LCD_SetBackColor(__IO uint16_t Color) +{ + BackColor = Color; +} + +/** + * @brief Sets the Text Font. + * @param fonts: specifies the font to be used. + * @retval None + */ +void LCD_SetFont(sFONT *fonts) +{ + LCD_Currentfonts = fonts; +} + +/** + * @brief Gets the Text Font. + * @param None. + * @retval the used font. + */ +sFONT *LCD_GetFont(void) +{ + return LCD_Currentfonts; +} + +/** + * @brief Clears the selected line. + * @param Line: the Line to be cleared. + * This parameter can be one of the following values: + * @arg Linex: where x can be 0..n + * @retval None + */ +void LCD_ClearLine(uint8_t Line) +{ + uint16_t refcolumn = 319; + int16_t deltacolumn = -LCD_Currentfonts->Width; + uint32_t i = 0; + + /* Send the string character by character on lCD */ + while (i <= 320/LCD_Currentfonts->Width) + { + /* Display one character on LCD */ + LCD_DisplayChar(Line, refcolumn, ' '); + /* Decrement the column position by deltacolumn(16 or -16 for HX8347G) */ + refcolumn += deltacolumn; + /* Increment the character counter */ + i++; + } +} + + +/** + * @brief Clears the hole LCD. + * @param Color: the color of the background. + * @retval None + */ +void LCD_Clear(uint16_t Color) +{ + uint32_t index = 0; + + if(LCDType == LCD_HX8347G) + { + LCD_SetCursor(0, 0); + } + else + { + LCD_SetCursor(0, 319); + } + + /* Prepare to write GRAM */ + LCD_WriteRAM_Prepare(); + + for(index = 0; index < (uint32_t)320*240; index++) + { + LCD_WriteRAM(Color); + } + + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while (SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); +} + + +/** + * @brief Sets the cursor position. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @retval None + */ +void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos) +{ + if(LCDType == LCD_HX8347G) + { + LCD_WriteReg(LCD_REG_6, 0x00); + LCD_WriteReg(LCD_REG_7, Xpos); + LCD_WriteReg(LCD_REG_2, Ypos >> 8); + LCD_WriteReg(LCD_REG_3, Ypos & 0xFF); + } + else + { + LCD_WriteReg(LCD_REG_32, Xpos); + LCD_WriteReg(LCD_REG_33, Ypos); + } +} + +/** + * @brief Draws a character on LCD. + * @param Xpos: the Line where to display the character shape. + * @param Ypos: start column address. + * @param c: pointer to the character data. + * @retval None + */ +void LCD_DrawChar(uint8_t Xpos, uint16_t Ypos, const uint16_t *c) +{ + uint32_t index = 0, i = 0; + uint8_t Xaddress = 0; + + Xaddress = Xpos; + + LCD_SetCursor(Xaddress, Ypos); + + for(index = 0; index < LCD_Currentfonts->Height; index++) + { + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + + for(i = 0; i < LCD_Currentfonts->Width; i++) + { + if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))|| + (((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 ))) + + { + LCD_WriteRAM(BackColor); + } + else + { + LCD_WriteRAM(TextColor); + } + } + + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while (SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); + Xaddress++; + LCD_SetCursor(Xaddress, Ypos); + } +} + + +/** + * @brief Displays one character (16dots width, 24dots height). + * @param Line: the Line where to display the character shape . + * This parameter can be one of the following values: + * @arg Linex: where x can be 0..9 + * @param Column: start column address. + * @param Ascii: character ascii code, must be between 0x20 and 0x7E. + * @retval None + */ +void LCD_DisplayChar(uint8_t Line, uint16_t Column, uint8_t Ascii) +{ + Ascii -= 32; + + if(LCDType == LCD_HX8347G) + { + Column = 319 - Column; + } + + LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]); +} + + +/** + * @brief Displays a maximum of 20 char on the LCD. + * @param Line: the Line where to display the character shape . + * This parameter can be one of the following values: + * @arg Linex: where x can be 0..9 + * @param *ptr: pointer to string to display on LCD. + * @retval None + */ +void LCD_DisplayStringLine(uint8_t Line, uint8_t *ptr) +{ + uint16_t refcolumn = 0; + int16_t deltacolumn; + + refcolumn = 319; + deltacolumn = -LCD_Currentfonts->Width; + + /* Send the string character by character on lCD */ + while (*ptr != 0) + { + /* Display one character on LCD */ + LCD_DisplayChar(Line, refcolumn, *ptr); + /* Decrement the column position by deltacolumn(16 or -16 for HX8347G) */ + refcolumn += deltacolumn; + /* Point on the next character */ + ptr++; + } +} + + +/** + * @brief Sets a display window + * @param Xpos: specifies the X buttom left position. + * @param Ypos: specifies the Y buttom left position. + * @param Height: display window height. + * @param Width: display window width. + * @retval None + */ +void LCD_SetDisplayWindow(uint8_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width) +{ + uint16_t EndY = 0; + uint8_t EndX = 0; + + if(LCDType == LCD_HX8347G) + { + Ypos = 319 - Ypos + Width - 1; + /* Horizontal GRAM Start Address */ + if(Xpos >= Height) + { + EndX = Xpos - Height + 1; + } + else + { + /* store StartX */ + EndX = 0; + } + + /* Horizontal GRAM Start Address */ + if(Ypos >= Width) + { + EndY = Ypos - Width + 1; + } + else + { + /* store StartY */ + EndY = 0; + } + /* Horizontal GRAM Start Address */ + StartY = EndY; + LCD_WriteReg(LCD_REG_2, StartY >> 8); + LCD_WriteReg(LCD_REG_3, StartY & 0xFF); + + /* Horizontal GRAM End Address */ + LCD_WriteReg(LCD_REG_4, (Ypos) >> 8); + LCD_WriteReg(LCD_REG_5, (Ypos) & 0xFF); + + /* Vertical GRAM Start Address */ + StartX = EndX; + LCD_WriteReg(LCD_REG_6, StartX >> 8); + LCD_WriteReg(LCD_REG_7, StartX); + + /* Vertical GRAM End Address */ + LCD_WriteReg(LCD_REG_8, Xpos >> 8); + LCD_WriteReg(LCD_REG_9, Xpos); + } + else + { + /* Horizontal GRAM Start Address */ + if(Xpos >= Height) + { + LCD_WriteReg(LCD_REG_80, (Xpos - Height + 1)); + } + else + { + LCD_WriteReg(LCD_REG_80, 0); + } + /* Horizontal GRAM End Address */ + LCD_WriteReg(LCD_REG_81, Xpos); + /* Vertical GRAM Start Address */ + if(Ypos >= Width) + { + LCD_WriteReg(LCD_REG_82, (Ypos - Width + 1)); + } + else + { + LCD_WriteReg(LCD_REG_82, 0); + } + /* Vertical GRAM End Address */ + LCD_WriteReg(LCD_REG_83, Ypos); + + LCD_SetCursor(Xpos, Ypos); + } +} + + +/** + * @brief Disables LCD Window mode. + * @param None + * @retval None + */ +void LCD_WindowModeDisable(void) +{ + if(LCDType == LCD_HX8347G) + { + LCD_SetDisplayWindow(239, 0x13F, 240, 320); + } + else + { + LCD_SetDisplayWindow(239, 0x13F, 240, 320); + LCD_WriteReg(LCD_REG_3, 0x1018); + } +} + +/** + * @brief Displays a line. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Length: line length. + * @param Direction: line direction. + * This parameter can be one of the following values: Vertical or Horizontal. + * @retval None + */ +void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction) +{ + uint32_t i = 0; + + if(LCDType == LCD_HX8347G) + { + LCD_SetCursor(Xpos, 319 - Ypos); + } + else + { + LCD_SetCursor(Xpos, Ypos); + } + + if(Direction == LCD_DIR_HORIZONTAL) + { + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + + for(i = 0; i < Length; i++) + { + LCD_WriteRAM(TextColor); + } + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while (SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); + } + else + { + for(i = 0; i < Length; i++) + { + LCD_WriteRAMWord(TextColor); + Xpos++; + if(LCDType == LCD_HX8347G) + { + LCD_SetCursor(Xpos, 319 - Ypos); + } + else + { + LCD_SetCursor(Xpos, Ypos); + } + } + } +} + + +/** + * @brief Displays a rectangle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Height: display rectangle height. + * @param Width: display rectangle width. + * @retval None + */ +void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width) +{ + LCD_DrawLine(Xpos, Ypos, Width, LCD_DIR_HORIZONTAL); + LCD_DrawLine((Xpos + Height), Ypos, Width, LCD_DIR_HORIZONTAL); + + LCD_DrawLine(Xpos, Ypos, Height, LCD_DIR_VERTICAL); + LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, LCD_DIR_VERTICAL); +} + + +/** + * @brief Displays a circle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Radius + * @retval None + */ +void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) +{ + int32_t D;/* Decision Variable */ + uint32_t CurX;/* Current X Value */ + uint32_t CurY;/* Current Y Value */ + + if(LCDType == LCD_HX8347G) + { + Ypos = 319 - Ypos; + } + + D = 3 - (Radius << 1); + CurX = 0; + CurY = Radius; + + while (CurX <= CurY) + { + LCD_SetCursor(Xpos + CurX, Ypos + CurY); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos + CurX, Ypos - CurY); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos - CurX, Ypos + CurY); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos - CurX, Ypos - CurY); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos + CurY, Ypos + CurX); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos + CurY, Ypos - CurX); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos - CurY, Ypos + CurX); + LCD_WriteRAMWord(TextColor); + + LCD_SetCursor(Xpos - CurY, Ypos - CurX); + LCD_WriteRAMWord(TextColor); + + if (D < 0) + { + D += (CurX << 2) + 6; + } + else + { + D += ((CurX - CurY) << 2) + 10; + CurY--; + } + CurX++; + } +} + + +/** + * @brief Displays a monocolor picture. + * @param Pict: pointer to the picture array. + * @retval None + */ +void LCD_DrawMonoPict(const uint32_t *Pict) +{ + uint32_t index = 0, i = 0; + + if(LCDType == LCD_HX8347G) + { + LCD_SetCursor(0, 319 - (LCD_PIXEL_WIDTH - 1)); + } + else + { + LCD_SetCursor(0, (LCD_PIXEL_WIDTH - 1)); + } + + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + + for(index = 0; index < 2400; index++) + { + for(i = 0; i < 32; i++) + { + if((Pict[index] & (1 << i)) == 0x00) + { + LCD_WriteRAM(BackColor); + } + else + { + LCD_WriteRAM(TextColor); + } + } + } + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while (SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); +} + + +/** + * @brief Displays a full rectangle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Height: rectangle height. + * @param Width: rectangle width. + * @retval None + */ +void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) +{ + LCD_SetTextColor(TextColor); + + LCD_DrawLine(Xpos, Ypos, Width, LCD_DIR_HORIZONTAL); + LCD_DrawLine((Xpos + Height), Ypos, Width, LCD_DIR_HORIZONTAL); + + LCD_DrawLine(Xpos, Ypos, Height, LCD_DIR_VERTICAL); + LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, LCD_DIR_VERTICAL); + + Width -= 2; + Height--; + Ypos--; + + LCD_SetTextColor(BackColor); + + while(Height--) + { + LCD_DrawLine(++Xpos, Ypos, Width, LCD_DIR_HORIZONTAL); + } + + LCD_SetTextColor(TextColor); +} + +/** + * @brief Displays a full circle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Radius + * @retval None + */ +void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) +{ + int32_t D; /* Decision Variable */ + uint32_t CurX;/* Current X Value */ + uint32_t CurY;/* Current Y Value */ + + D = 3 - (Radius << 1); + + CurX = 0; + CurY = Radius; + + LCD_SetTextColor(BackColor); + + while (CurX <= CurY) + { + if(CurY > 0) + { + LCD_DrawLine(Xpos - CurX, Ypos + CurY, 2*CurY, LCD_DIR_HORIZONTAL); + LCD_DrawLine(Xpos + CurX, Ypos + CurY, 2*CurY, LCD_DIR_HORIZONTAL); + } + + if(CurX > 0) + { + LCD_DrawLine(Xpos - CurY, Ypos + CurX, 2*CurX, LCD_DIR_HORIZONTAL); + LCD_DrawLine(Xpos + CurY, Ypos + CurX, 2*CurX, LCD_DIR_HORIZONTAL); + } + if (D < 0) + { + D += (CurX << 2) + 6; + } + else + { + D += ((CurX - CurY) << 2) + 10; + CurY--; + } + CurX++; + } + + LCD_SetTextColor(TextColor); + LCD_DrawCircle(Xpos, Ypos, Radius); +} + +/** + * @brief Displays an uni line (between two points). + * @param x1: specifies the point 1 x position. + * @param y1: specifies the point 1 y position. + * @param x2: specifies the point 2 x position. + * @param y2: specifies the point 2 y position. + * @retval None + */ +void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0, + yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0, + curpixel = 0; + + deltax = ABS(x2 - x1); /* The difference between the x's */ + deltay = ABS(y2 - y1); /* The difference between the y's */ + x = x1; /* Start x off at the first pixel */ + y = y1; /* Start y off at the first pixel */ + + if (x2 >= x1) /* The x-values are increasing */ + { + xinc1 = 1; + xinc2 = 1; + } + else /* The x-values are decreasing */ + { + xinc1 = -1; + xinc2 = -1; + } + + if (y2 >= y1) /* The y-values are increasing */ + { + yinc1 = 1; + yinc2 = 1; + } + else /* The y-values are decreasing */ + { + yinc1 = -1; + yinc2 = -1; + } + + if (deltax >= deltay) /* There is at least one x-value for every y-value */ + { + xinc1 = 0; /* Don't change the x when numerator >= denominator */ + yinc2 = 0; /* Don't change the y for every iteration */ + den = deltax; + num = deltax / 2; + numadd = deltay; + numpixels = deltax; /* There are more x-values than y-values */ + } + else /* There is at least one y-value for every x-value */ + { + xinc2 = 0; /* Don't change the x for every iteration */ + yinc1 = 0; /* Don't change the y when numerator >= denominator */ + den = deltay; + num = deltay / 2; + numadd = deltax; + numpixels = deltay; /* There are more y-values than x-values */ + } + + for (curpixel = 0; curpixel <= numpixels; curpixel++) + { + PutPixel(x, y); /* Draw the current pixel */ + num += numadd; /* Increase the numerator by the top of the fraction */ + if (num >= den) /* Check if numerator >= denominator */ + { + num -= den; /* Calculate the new numerator value */ + x += xinc1; /* Change the x as appropriate */ + y += yinc1; /* Change the y as appropriate */ + } + x += xinc2; /* Change the x as appropriate */ + y += yinc2; /* Change the y as appropriate */ + } +} + +/** + * @brief Displays an polyline (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_PolyLine(pPoint Points, uint16_t PointCount) +{ + int16_t X = 0, Y = 0; + + if(PointCount < 2) + { + return; + } + + while(--PointCount) + { + X = Points->X; + Y = Points->Y; + Points++; + LCD_DrawUniLine(X, Y, Points->X, Points->Y); + } +} + +/** + * @brief Displays an relative polyline (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @param Closed: specifies if the draw is closed or not. + * 1: closed, 0 : not closed. + * @retval None + */ +static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed) +{ + int16_t X = 0, Y = 0; + pPoint First = Points; + + if(PointCount < 2) + { + return; + } + X = Points->X; + Y = Points->Y; + while(--PointCount) + { + Points++; + LCD_DrawUniLine(X, Y, X + Points->X, Y + Points->Y); + X = X + Points->X; + Y = Y + Points->Y; + } + if(Closed) + { + LCD_DrawUniLine(First->X, First->Y, X, Y); + } +} + +/** + * @brief Displays a closed polyline (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount) +{ + LCD_PolyLine(Points, PointCount); + LCD_DrawUniLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y); +} + +/** + * @brief Displays a relative polyline (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount) +{ + LCD_PolyLineRelativeClosed(Points, PointCount, 0); +} + +/** + * @brief Displays a closed relative polyline (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount) +{ + LCD_PolyLineRelativeClosed(Points, PointCount, 1); +} + + +/** + * @brief Displays a full polyline (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_FillPolyLine(pPoint Points, uint16_t PointCount) +{ + /* public-domain code by Darel Rex Finley, 2007 */ + uint16_t nodes = 0, nodeX[MAX_POLY_CORNERS], pixelX = 0, pixelY = 0, i = 0, + j = 0, swap = 0; + uint16_t IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0; + + IMAGE_LEFT = IMAGE_RIGHT = Points->X; + IMAGE_TOP= IMAGE_BOTTOM = Points->Y; + + for(i = 1; i < PointCount; i++) + { + pixelX = POLY_X(i); + if(pixelX < IMAGE_LEFT) + { + IMAGE_LEFT = pixelX; + } + if(pixelX > IMAGE_RIGHT) + { + IMAGE_RIGHT = pixelX; + } + + pixelY = POLY_Y(i); + if(pixelY < IMAGE_TOP) + { + IMAGE_TOP = pixelY; + } + if(pixelY > IMAGE_BOTTOM) + { + IMAGE_BOTTOM = pixelY; + } + } + + LCD_SetTextColor(BackColor); + + /* Loop through the rows of the image. */ + for (pixelY = IMAGE_TOP; pixelY < IMAGE_BOTTOM; pixelY++) + { + /* Build a list of nodes. */ + nodes = 0; j = PointCount-1; + + for (i = 0; i < PointCount; i++) + { + if (((POLY_Y(i)<(double) pixelY) && (POLY_Y(j)>=(double) pixelY)) || ((POLY_Y(j)<(double) pixelY) && (POLY_Y(i)>=(double) pixelY))) + { + nodeX[nodes++]=(int) (POLY_X(i)+((pixelY-POLY_Y(i))*(POLY_X(j)-POLY_X(i)))/(POLY_Y(j)-POLY_Y(i))); + } + j = i; + } + + /* Sort the nodes, via a simple "Bubble" sort. */ + i = 0; + while (i < nodes-1) + { + if (nodeX[i]>nodeX[i+1]) + { + swap = nodeX[i]; + nodeX[i] = nodeX[i+1]; + nodeX[i+1] = swap; + if(i) + { + i--; + } + } + else + { + i++; + } + } + + /* Fill the pixels between node pairs. */ + for (i = 0; i < nodes; i+=2) + { + if(nodeX[i] >= IMAGE_RIGHT) + { + break; + } + if(nodeX[i+1] > IMAGE_LEFT) + { + if (nodeX[i] < IMAGE_LEFT) + { + nodeX[i]=IMAGE_LEFT; + } + if(nodeX[i+1] > IMAGE_RIGHT) + { + nodeX[i+1] = IMAGE_RIGHT; + } + LCD_SetTextColor(BackColor); + LCD_DrawLine(pixelY, nodeX[i+1], nodeX[i+1] - nodeX[i], LCD_DIR_HORIZONTAL); + LCD_SetTextColor(TextColor); + PutPixel(pixelY, nodeX[i+1]); + PutPixel(pixelY, nodeX[i]); + /* for (j=nodeX[i]; j<nodeX[i+1]; j++) PutPixel(j,pixelY); */ + } + } + } + + /* draw the edges */ + LCD_SetTextColor(TextColor); +} + +/** + * @brief Reset LCD control line(/CS) and Send Start-Byte + * @param Start_Byte: the Start-Byte to be sent + * @retval None + */ +void LCD_nCS_StartByte(uint8_t Start_Byte) +{ + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_RESET); + + SPI_SendData8(LCD_SPI, Start_Byte); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + SPI_ReceiveData8(LCD_SPI); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); +} + + +/** + * @brief Writes index to select the LCD register. + * @param LCD_Reg: address of the selected register. + * @retval None + */ +void LCD_WriteRegIndex(uint8_t LCD_Reg) +{ + /* Reset LCD control line(/CS) and Send Start-Byte */ + LCD_nCS_StartByte(START_BYTE | SET_INDEX); + + /* Write 16-bit Reg Index (High Byte is 0) */ + SPI_SendData8(LCD_SPI, 0x00); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + SPI_ReceiveData8(LCD_SPI); + + SPI_SendData8(LCD_SPI, LCD_Reg); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + SPI_ReceiveData8(LCD_SPI); + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); +} + + +/** + * @brief Writes to the selected LCD register. + * @param LCD_Reg: address of the selected register. + * @param LCD_RegValue: value to write to the selected register. + * @retval None + */ +void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue) +{ + /* Write 16-bit Index (then Write Reg) */ + LCD_WriteRegIndex(LCD_Reg); + + /* Write 16-bit Reg */ + /* Reset LCD control line(/CS) and Send Start-Byte */ + LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG); + + SPI_SendData8(LCD_SPI, LCD_RegValue >> 8); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + SPI_ReceiveData8(LCD_SPI); + + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); + SPI_SendData8(LCD_SPI, (LCD_RegValue & 0xFF)); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + SPI_ReceiveData8(LCD_SPI); + + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); +} + + +/** + * @brief Reads the selected LCD Register. + * @note For HX8347G controller, the LCD registers are 8-bit length + * while it is 16-bit lenght for ILI9328 controller. + * @param LCD_Reg: address of the selected register. + * @retval LCD Register Value. + */ +uint16_t LCD_ReadReg(uint8_t LCD_Reg) +{ + uint32_t i; + + /* Check if the LCD controller is already recognized or not */ + if(LCDType == LCD_HX8347G) + { + /********************* HX8347G Read Sequence ******************************/ + /* Write 16-bit Index (then Read Reg) */ + LCD_WriteRegIndex(LCD_Reg); + + /* Read 16-bit Reg */ + /* Reset LCD control line(/CS) and Send Start-Byte */ + LCD_nCS_StartByte(START_BYTE | LCD_READ_REG); + + /* Wait until a data is sent(not busy), before reading dummy bytes*/ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET) + + /* Read upper byte */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); + SPI_SendData8(LCD_SPI, 0xFF); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + return(SPI_ReceiveData8(LCD_SPI)); + } + else if(LCDType == LCD_ILI9328) + { + /********************* ILI9328 Read Sequence ******************************/ + /* Write 16-bit Index (then Read Reg) */ + LCD_WriteRegIndex(LCD_Reg); + /* Read 16-bit Reg */ + /* Reset LCD control line(/CS) and Send Start-Byte */ + LCD_nCS_StartByte(START_BYTE | LCD_READ_REG); + + for(i = 0; i < 5; i++) + { + SPI_SendData8(LCD_SPI, 0xFF); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + /* One byte of invalid dummy data read after the start byte */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE) == RESET); + SPI_ReceiveData8(LCD_SPI); + } + /* Send dummy byte */ + SPI_SendData8(LCD_SPI, 0xFF); + /* Read upper byte */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + /* Read lower byte */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE) == RESET); + /* Send dummy byte */ + SPI_SendData8(LCD_SPI, 0xFF); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + /* Read lower byte */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE) == RESET); + return(SPI_I2S_ReceiveData16(LCD_SPI)); + } + else /* The LCD controller isn't yet recognized */ + { + /********************* HX8347G Read Sequence ******************************/ + /* Write 16-bit Index (then Read Reg) */ + LCD_WriteRegIndex(LCD_Reg); + + /* Read 16-bit Reg */ + /* Reset LCD control line(/CS) and Send Start-Byte */ + LCD_nCS_StartByte(START_BYTE | LCD_READ_REG); + + /* Wait until a data is sent(not busy), before reading dummy bytes*/ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET) + + /* Read upper byte */ + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); + SPI_SendData8(LCD_SPI, 0xFF); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE)== RESET); + if(SPI_ReceiveData8(LCD_SPI) == LCD_HX8347G) + { + LCDType = LCD_HX8347G; + } + else + { + LCDType = LCD_ILI9328; + } + return(LCDType); + } +} + + +/** + * @brief Prepare to write to the LCD RAM. + * @param None + * @retval None + */ +void LCD_WriteRAM_Prepare(void) +{ + LCD_WriteRegIndex(LCD_REG_34); /* Select GRAM Reg */ + + /* Reset LCD control line(/CS) and Send Start-Byte */ + LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG); +} + + +/** + * @brief Writes 1 word to the LCD RAM. + * @param RGB_Code: the pixel color in RGB mode (5-6-5). + * @retval None + */ +void LCD_WriteRAMWord(uint16_t RGB_Code) +{ + LCD_WriteRAM_Prepare(); + + LCD_WriteRAM(RGB_Code); + + /* Wait until a data is sent(not busy), before config /CS HIGH */ + while (SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET); + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); +} + +/** + * @brief Writes to the LCD RAM. + * @param RGB_Code: the pixel color in RGB mode (5-6-5). + * @retval None + */ +void LCD_WriteRAM(uint16_t RGB_Code) +{ + SPI_SendData8(LCD_SPI, RGB_Code >> 8); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); + + SPI_SendData8(LCD_SPI, RGB_Code & 0xFF); + while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET); +} + + +/** + * @brief Power on the LCD. + * @param None + * @retval None + */ +void LCD_PowerOn(void) +{ + if(LCDType == LCD_HX8347G) + { + /* Power on setting up flow */ + LCD_WriteReg(LCD_REG_24, 0x36); /* Display frame rate = 70Hz RADJ = '0110' */ + LCD_WriteReg(LCD_REG_25, 0x01); /* OSC_EN = 1 */ + LCD_WriteReg(LCD_REG_28, 0x06); /* AP[2:0] = 111 */ + LCD_WriteReg(LCD_REG_31,0x90); /* GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0*/ + _delay_(10); + /* 262k/65k color selection */ + LCD_WriteReg(LCD_REG_23, 0x05); /* default 0x06 262k color, 0x05 65k color */ + /* SET PANEL */ + LCD_WriteReg(LCD_REG_54, 0x09); /* SS_PANEL = 1, GS_PANEL = 0,REV_PANEL = 0, BGR_PANEL = 1 */ + } + else + { + /* Power On sequence -----------------------------------------------------*/ + LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ + LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */ + _delay_(20); /* Dis-charge capacitor power voltage (200ms) */ + LCD_WriteReg(LCD_REG_16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_18, 0x0139); /* VREG1OUT voltage */ + _delay_(5); /* delay 50 ms */ + LCD_WriteReg(LCD_REG_19, 0x1d00); /* VDV[4:0] for VCOM amplitude */ + LCD_WriteReg(LCD_REG_41, 0x0013); /* VCM[4:0] for VCOMH */ + _delay_(5); /* delay 50 ms */ + LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */ + } +} + + +/** + * @brief Enables the Display. + * @param None + * @retval None + */ +void LCD_DisplayOn(void) +{ + /* Display On */ + if(LCDType == LCD_HX8347G) + { + LCD_WriteReg(LCD_REG_40, 0x38); + _delay_(60); + LCD_WriteReg(LCD_REG_40, 0x3C); + } + else + { + LCD_WriteReg(LCD_REG_7, 0x0173); + } +} + + +/** + * @brief Disables the Display. + * @param None + * @retval None + */ +void LCD_DisplayOff(void) +{ + /* Display On */ + if(LCDType == LCD_HX8347G) + { + LCD_WriteReg(LCD_REG_40, 0x38); + _delay_(60); + LCD_WriteReg(LCD_REG_40, 0x04); + } + else + { + /* Display Off */ + LCD_WriteReg(LCD_REG_7, 0x0); + } +} + + +/** + * @brief Configures LCD control lines in Output Push-Pull mode. + * @note The LCD_NCS line can be configured in Open Drain mode + * when VDDIO is lower than required LCD supply. + * @param None + * @retval None + */ +void LCD_CtrlLinesConfig(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHBPeriphClockCmd(LCD_NCS_GPIO_CLK, ENABLE); + + /* Configure NCS in Output Push-Pull mode */ + GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure); + + LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET); +} + +/** + * @brief Sets or reset LCD control lines. + * @param GPIOx: where x can be B or D to select the GPIO peripheral. + * @param CtrlPins: the Control line. + * This parameter can be: + * @arg LCD_NCS_PIN: Chip Select pin + * @arg LCD_NWR_PIN: Read/Write Selection pin + * @arg LCD_RS_PIN: Register/RAM Selection pin + * @param BitVal: specifies the value to be written to the selected bit. + * This parameter can be: + * @arg Bit_RESET: to clear the port pin + * @arg Bit_SET: to set the port pin + * @retval None + */ +void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal) +{ + /* Set or Reset the control line */ + GPIO_WriteBit(GPIOx, (uint16_t)CtrlPins, (BitAction)BitVal); +} + + +/** + * @brief Configures the LCD_SPI interface. + * @param None + * @retval None + */ +void LCD_SPIConfig(void) +{ + SPI_InitTypeDef SPI_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + /* Enable LCD_SPI_SCK_GPIO_CLK, LCD_SPI_MISO_GPIO_CLK and LCD_SPI_MOSI_GPIO_CLK clock */ + RCC_AHBPeriphClockCmd(LCD_SPI_SCK_GPIO_CLK | LCD_SPI_MISO_GPIO_CLK | LCD_SPI_MOSI_GPIO_CLK, ENABLE); + + /* Enable LCD_SPI and SYSCFG clock */ + RCC_APB1PeriphClockCmd(LCD_SPI_CLK, ENABLE); + + /* Configure LCD_SPI SCK pin */ + GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); + + /* Configure LCD_SPI MISO pin */ + GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN; + GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); + + /* Configure LCD_SPI MOSI pin */ + GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN; + GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); + + /* Connect SPI SCK */ + GPIO_PinAFConfig(LCD_SPI_SCK_GPIO_PORT, LCD_SPI_SCK_SOURCE, LCD_SPI_SCK_AF); + + /* Connect SPI MISO */ + GPIO_PinAFConfig(LCD_SPI_MISO_GPIO_PORT, LCD_SPI_MISO_SOURCE, LCD_SPI_MISO_AF); + + /* Connect SPI MOSI */ + GPIO_PinAFConfig(LCD_SPI_MOSI_GPIO_PORT, LCD_SPI_MOSI_SOURCE, LCD_SPI_MOSI_AF); + + SPI_I2S_DeInit(LCD_SPI); + + /* SPI Config */ + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; + SPI_Init(LCD_SPI, &SPI_InitStructure); + + /* Configure the RX FIFO Threshold */ + SPI_RxFIFOThresholdConfig(LCD_SPI, SPI_RxFIFOThreshold_QF); + + /* SPI enable */ + SPI_Cmd(LCD_SPI, ENABLE); +} + +/** + * @brief Displays a pixel. + * @param x: pixel x. + * @param y: pixel y. + * @retval None + */ +static void PutPixel(int16_t x, int16_t y) +{ + if(x < 0 || x > 239 || y < 0 || y > 319) + { + return; + } + LCD_DrawLine(x, y, 1, LCD_DIR_HORIZONTAL); +} + +#ifndef USE_Delay +/** + * @brief Inserts a delay time. + * @param nCount: specifies the delay time length. + * @retval None + */ +static void delay(__IO uint32_t nCount) +{ + __IO uint32_t index = 0; + for(index = (65500 * nCount); index != 0; index--) + { + } +} +#endif /* USE_Delay*/ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_lcd.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_lcd.h new file mode 100644 index 0000000..e8662a2 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM32373C_EVAL/stm32373c_eval_lcd.h @@ -0,0 +1,420 @@ +/** + ****************************************************************************** + * @file stm32373c_eval_lcd.h + * @author MCD Application Team + * @version V1.0.0 + * @date 20-September-2012 + * @brief This file contains all the functions prototypes for the stm32373c_eval_lcd + * firmware driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> + * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32373C_EVAL_LCD_H +#define __STM32373C_EVAL_LCD_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f37x.h" +#include "../Common/fonts.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL + * @{ + */ + +/** @addtogroup STM32373C_EVAL_LCD + * @{ + */ + + +/** @defgroup STM32373C_EVAL_LCD_Exported_Types + * @{ + */ +typedef struct +{ + int16_t X; + int16_t Y; +} Point, * pPoint; +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Exported_Constants + * @{ + */ + +#define LCD_ILI9328 0x9328 +#define LCD_HX8347G 0x0075 + +/** + * @brief Uncomment the line below if you want to use user defined Delay function + * (for precise timing), otherwise default _delay_ function defined within + * this driver is used (less precise timing). + */ +/* #define USE_Delay */ + +#ifdef USE_Delay +#include "main.h" + #define _delay_ Delay /* !< User can provide more timing precise _delay_ function + (with 10ms time base), using SysTick for example */ +#else + #define _delay_ delay /* !< Default _delay_ function with less precise timing */ +#endif + + +/** + * @brief LCD Control pins + */ +#define LCD_NCS_PIN GPIO_Pin_2 +#define LCD_NCS_GPIO_PORT GPIOD +#define LCD_NCS_GPIO_CLK RCC_AHBPeriph_GPIOD + +/** + * @brief LCD SPI Interface pins + */ +#define LCD_SPI_SCK_PIN GPIO_Pin_10 /* PC.10 */ +#define LCD_SPI_SCK_GPIO_PORT GPIOC /* GPIOC */ +#define LCD_SPI_SCK_GPIO_CLK RCC_AHBPeriph_GPIOC +#define LCD_SPI_SCK_SOURCE GPIO_PinSource10 +#define LCD_SPI_SCK_AF GPIO_AF_6 +#define LCD_SPI_MISO_PIN GPIO_Pin_11 /* PC.11 */ +#define LCD_SPI_MISO_GPIO_PORT GPIOC /* GPIOC */ +#define LCD_SPI_MISO_GPIO_CLK RCC_AHBPeriph_GPIOC +#define LCD_SPI_MISO_SOURCE GPIO_PinSource11 +#define LCD_SPI_MISO_AF GPIO_AF_6 +#define LCD_SPI_MOSI_PIN GPIO_Pin_12 /* PC.12 */ +#define LCD_SPI_MOSI_GPIO_PORT GPIOC /* GPIOC */ +#define LCD_SPI_MOSI_GPIO_CLK RCC_AHBPeriph_GPIOC +#define LCD_SPI_MOSI_SOURCE GPIO_PinSource12 +#define LCD_SPI_MOSI_AF GPIO_AF_6 +#define LCD_SPI SPI3 +#define LCD_SPI_CLK RCC_APB1Periph_SPI3 + + +/** + * @brief LCD Registers + */ +#define LCD_REG_0 0x00 +#define LCD_REG_1 0x01 +#define LCD_REG_2 0x02 +#define LCD_REG_3 0x03 +#define LCD_REG_4 0x04 +#define LCD_REG_5 0x05 +#define LCD_REG_6 0x06 +#define LCD_REG_7 0x07 +#define LCD_REG_8 0x08 +#define LCD_REG_9 0x09 +#define LCD_REG_10 0x0A +#define LCD_REG_12 0x0C +#define LCD_REG_13 0x0D +#define LCD_REG_14 0x0E +#define LCD_REG_15 0x0F +#define LCD_REG_16 0x10 +#define LCD_REG_17 0x11 +#define LCD_REG_18 0x12 +#define LCD_REG_19 0x13 +#define LCD_REG_20 0x14 +#define LCD_REG_21 0x15 +#define LCD_REG_22 0x16 +#define LCD_REG_23 0x17 +#define LCD_REG_24 0x18 +#define LCD_REG_25 0x19 +#define LCD_REG_26 0x1A +#define LCD_REG_27 0x1B +#define LCD_REG_28 0x1C +#define LCD_REG_29 0x1D +#define LCD_REG_30 0x1E +#define LCD_REG_31 0x1F +#define LCD_REG_32 0x20 +#define LCD_REG_33 0x21 +#define LCD_REG_34 0x22 +#define LCD_REG_35 0x23 +#define LCD_REG_36 0x24 +#define LCD_REG_37 0x25 +#define LCD_REG_38 0x26 +#define LCD_REG_39 0x27 +#define LCD_REG_40 0x28 +#define LCD_REG_41 0x29 +#define LCD_REG_42 0x2A +#define LCD_REG_43 0x2B +#define LCD_REG_44 0x2C +#define LCD_REG_45 0x2D +#define LCD_REG_46 0x2E +#define LCD_REG_47 0x2F +#define LCD_REG_48 0x30 +#define LCD_REG_49 0x31 +#define LCD_REG_50 0x32 +#define LCD_REG_51 0x33 +#define LCD_REG_52 0x34 +#define LCD_REG_53 0x35 +#define LCD_REG_54 0x36 +#define LCD_REG_55 0x37 +#define LCD_REG_56 0x38 +#define LCD_REG_57 0x39 +#define LCD_REG_58 0x3A +#define LCD_REG_59 0x3B +#define LCD_REG_60 0x3C +#define LCD_REG_61 0x3D +#define LCD_REG_62 0x3E +#define LCD_REG_63 0x3F +#define LCD_REG_64 0x40 +#define LCD_REG_65 0x41 +#define LCD_REG_66 0x42 +#define LCD_REG_67 0x43 +#define LCD_REG_68 0x44 +#define LCD_REG_69 0x45 +#define LCD_REG_70 0x46 +#define LCD_REG_71 0x47 +#define LCD_REG_72 0x48 +#define LCD_REG_73 0x49 +#define LCD_REG_74 0x4A +#define LCD_REG_75 0x4B +#define LCD_REG_76 0x4C +#define LCD_REG_77 0x4D +#define LCD_REG_78 0x4E +#define LCD_REG_79 0x4F +#define LCD_REG_80 0x50 +#define LCD_REG_81 0x51 +#define LCD_REG_82 0x52 +#define LCD_REG_83 0x53 +#define LCD_REG_84 0x54 +#define LCD_REG_85 0x55 +#define LCD_REG_86 0x56 +#define LCD_REG_87 0x57 +#define LCD_REG_88 0x58 +#define LCD_REG_89 0x59 +#define LCD_REG_90 0x5A +#define LCD_REG_91 0x5B +#define LCD_REG_92 0x5C +#define LCD_REG_93 0x5D +#define LCD_REG_94 0x5E +#define LCD_REG_95 0x5F +#define LCD_REG_96 0x60 +#define LCD_REG_97 0x61 +#define LCD_REG_106 0x6A +#define LCD_REG_118 0x76 +#define LCD_REG_128 0x80 +#define LCD_REG_129 0x81 +#define LCD_REG_130 0x82 +#define LCD_REG_131 0x83 +#define LCD_REG_132 0x84 +#define LCD_REG_133 0x85 +#define LCD_REG_134 0x86 +#define LCD_REG_135 0x87 +#define LCD_REG_136 0x88 +#define LCD_REG_137 0x89 +#define LCD_REG_139 0x8B +#define LCD_REG_140 0x8C +#define LCD_REG_141 0x8D +#define LCD_REG_143 0x8F +#define LCD_REG_144 0x90 +#define LCD_REG_145 0x91 +#define LCD_REG_146 0x92 +#define LCD_REG_147 0x93 +#define LCD_REG_148 0x94 +#define LCD_REG_149 0x95 +#define LCD_REG_150 0x96 +#define LCD_REG_151 0x97 +#define LCD_REG_152 0x98 +#define LCD_REG_153 0x99 +#define LCD_REG_154 0x9A +#define LCD_REG_157 0x9D +#define LCD_REG_192 0xC0 +#define LCD_REG_193 0xC1 +#define LCD_REG_226 0xE2 +#define LCD_REG_227 0xE3 +#define LCD_REG_228 0xE4 +#define LCD_REG_229 0xE5 +#define LCD_REG_230 0xE6 +#define LCD_REG_231 0xE7 +#define LCD_REG_232 0xE8 +#define LCD_REG_233 0xE9 +#define LCD_REG_234 0xEA +#define LCD_REG_235 0xEB +#define LCD_REG_236 0xEC +#define LCD_REG_237 0xED +#define LCD_REG_239 0xEF +#define LCD_REG_241 0xF1 +#define LCD_REG_242 0xF2 + + +/** + * @brief LCD color + */ +#define LCD_COLOR_WHITE 0xFFFF +#define LCD_COLOR_BLACK 0x0000 +#define LCD_COLOR_GREY 0xF7DE +#define LCD_COLOR_BLUE 0x001F +#define LCD_COLOR_BLUE2 0x051F +#define LCD_COLOR_RED 0xF800 +#define LCD_COLOR_MAGENTA 0xF81F +#define LCD_COLOR_GREEN 0x07E0 +#define LCD_COLOR_CYAN 0x7FFF +#define LCD_COLOR_YELLOW 0xFFE0 + +/** + * @brief LCD Lines depending on the chosen fonts. + */ +#define LCD_LINE_0 LINE(0) +#define LCD_LINE_1 LINE(1) +#define LCD_LINE_2 LINE(2) +#define LCD_LINE_3 LINE(3) +#define LCD_LINE_4 LINE(4) +#define LCD_LINE_5 LINE(5) +#define LCD_LINE_6 LINE(6) +#define LCD_LINE_7 LINE(7) +#define LCD_LINE_8 LINE(8) +#define LCD_LINE_9 LINE(9) +#define LCD_LINE_10 LINE(10) +#define LCD_LINE_11 LINE(11) +#define LCD_LINE_12 LINE(12) +#define LCD_LINE_13 LINE(13) +#define LCD_LINE_14 LINE(14) +#define LCD_LINE_15 LINE(15) +#define LCD_LINE_16 LINE(16) +#define LCD_LINE_17 LINE(17) +#define LCD_LINE_18 LINE(18) +#define LCD_LINE_19 LINE(19) +#define LCD_LINE_20 LINE(20) +#define LCD_LINE_21 LINE(21) +#define LCD_LINE_22 LINE(22) +#define LCD_LINE_23 LINE(23) +#define LCD_LINE_24 LINE(24) +#define LCD_LINE_25 LINE(25) +#define LCD_LINE_26 LINE(26) +#define LCD_LINE_27 LINE(27) +#define LCD_LINE_28 LINE(28) +#define LCD_LINE_29 LINE(29) + + +/** + * @brief LCD default font + */ +#define LCD_DEFAULT_FONT Font16x24 + +/** + * @brief LCD Direction + */ +#define LCD_DIR_HORIZONTAL 0x0000 +#define LCD_DIR_VERTICAL 0x0001 + +/** + * @brief LCD Size (Width and Height) + */ +#define LCD_PIXEL_WIDTH 0x0140 +#define LCD_PIXEL_HEIGHT 0x00F0 + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Exported_Macros + * @{ + */ +#define ASSEMBLE_RGB(R, G, B) ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3)) + +/** + * @} + */ + +/** @defgroup STM32373C_EVAL_LCD_Exported_Functions + * @{ + */ +void LCD_DeInit(void); +void STM32373C_LCD_Init(void); +void LCD_SwapDirection(FunctionalState NewState); +void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor); +void LCD_GetColors(__IO uint16_t *_TextColor, __IO uint16_t *_BackColor); +void LCD_SetTextColor(__IO uint16_t Color); +void LCD_SetBackColor(__IO uint16_t Color); +void LCD_ClearLine(uint8_t Line); +void LCD_Clear(uint16_t Color); +void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos); +void LCD_DrawChar(uint8_t Xpos, uint16_t Ypos, const uint16_t *c); +void LCD_DisplayChar(uint8_t Line, uint16_t Column, uint8_t Ascii); +void LCD_SetFont(sFONT *fonts); +sFONT *LCD_GetFont(void); +void LCD_DisplayStringLine(uint8_t Line, uint8_t *ptr); +void LCD_SetDisplayWindow(uint8_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width); +void LCD_WindowModeDisable(void); +void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction); +void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width); +void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); +void LCD_DrawMonoPict(const uint32_t *Pict); +void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); +void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); +void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); +void LCD_PolyLine(pPoint Points, uint16_t PointCount); +void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount); +void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount); +void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount); +void LCD_FillPolyLine(pPoint Points, uint16_t PointCount); +void LCD_nCS_StartByte(uint8_t Start_Byte); +void LCD_WriteRegIndex(uint8_t LCD_Reg); +void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue); +void LCD_WriteRAM_Prepare(void); +void LCD_WriteRAMWord(uint16_t RGB_Code); +uint16_t LCD_ReadReg(uint8_t LCD_Reg); +void LCD_WriteRAM(uint16_t RGB_Code); +void LCD_PowerOn(void); +void LCD_DisplayOn(void); +void LCD_DisplayOff(void); +void LCD_CtrlLinesConfig(void); +void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal); +void LCD_SPIConfig(void); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32373C_EVAL_LCD_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |