main.c
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:11k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. /// dir "TWI EEPROM Project"
  31. ///
  32. /// !!!Purpose
  33. ///
  34. /// This example program demonstrates how to use the TWI peripheral of an AT91
  35. /// microcontroller to access an external serial EEPROM chip. 
  36. ///
  37. /// !See
  38. /// - aic: Advanced interrupt controller driver
  39. /// - twi: Two wire interface driver
  40. ///
  41. /// !!!Requirements
  42. ///
  43. /// An external serial EEPROM must be connected to the TWI bus of the 
  44. /// microcontroller. For further information on this topic, please refer to 
  45. /// the following application note: 
  46. /// <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6327.pdf">
  47. /// Using the Two-wire interface (TWI) in Master Mode on AT91 Microcontrollers. </a>
  48. ///
  49. /// Pay particular attention to the fact that on some boards, such as the
  50. /// AT91SAM7S-EK, there is no pull-up on the TWI bus: they must be 
  51. /// added externally. 
  52. ///
  53. /// !!!Description
  54. ///
  55. /// This software performs simple tests on the first and second page of the EEPROM: 
  56. /// - Sets both pages to all zeroes 
  57. /// - Writes pattern in page #0 (polling) 
  58. /// - Reads back data in page #0 and compare with original pattern (polling) 
  59. /// - Writes pattern in page #1 (interrupts) 
  60. /// - Reads back data in page #1 and compare with original pattern (interrupts) 
  61. ///
  62. /// !!!Usage
  63. ///
  64. /// -# Compile the application. 
  65. /// -# Connect the DBGU port of the evaluation board to the computer and open 
  66. /// it in a terminal.
  67. ///    - Settings: 115200 bauds, 8 bits, 1 stop bit, no parity, no flow control. 
  68. /// -# Download the program inside the evaluation board and run it. Please refer to
  69. ///    <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6132.pdf">
  70. ///    the SAM-BA User Guide, 
  71. ///    <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6310.pdf">
  72. ///    the GNU-Based Software Development</a> application note or to the 
  73. ///    <a href="http://www.iar.se/website1/1.0.1.0/78/1/index.php?">
  74. ///    IAR EWARM User Guide</a>, 
  75. ///    depending on your chosen solution. 
  76. /// -# Upon startup, the application will output the following line on the DBGU: 
  77. ///    code
  78. ///     -- Basic TWI EEPROM Project xxx --
  79. ///     -- AT91xxxxxx-xx
  80. ///     -- Compiled: xxx xx xxxx xx:xx:xx --
  81. ///    endcode
  82. /// -# The following traces detail operations on the EEPROM, displaying success 
  83. ///    or error messages depending on the results of the commands. 
  84. ///
  85. //------------------------------------------------------------------------------
  86. //------------------------------------------------------------------------------
  87. /// unit
  88. ///
  89. /// !Purpose
  90. ///
  91. /// This file contains all the specific code for the 
  92. /// basic-twi-eeprom-project.
  93. ///
  94. /// !Contents
  95. /// The code can be roughly broken down as follows:
  96. ///    - TWI interrupt handler
  97. ///    - The main function, which implements the program behavior
  98. ///       - Configure TWI
  99. ///       - Sets the first and second page of the EEPROM to all zeroes
  100. ///       - Writes pattern in page 0; 
  101. ///          Reads back data in page 0 and compare with original pattern (polling). 
  102. ///       - Writes pattern in page 1; 
  103. ///          Reads back data in page 1 and compare with original pattern (interrupts). 
  104. ///
  105. /// Please refer to the list of functions in the #Overview# tab of this unit
  106. /// for more detailed information.
  107. //------------------------------------------------------------------------------
  108. //------------------------------------------------------------------------------
  109. //         Headers
  110. //------------------------------------------------------------------------------
  111. #include <board.h>
  112. #include <pio/pio.h>
  113. #include <aic/aic.h>
  114. #include <dbgu/dbgu.h>
  115. #include <twi/twi.h>
  116. #include <utility/math.h>
  117. #include <utility/assert.h>
  118. #include <utility/trace.h>
  119. #include <drivers/async/async.h>
  120. #include <drivers/twi/twid.h>
  121. #include <stdio.h>
  122. #include <string.h>
  123. //------------------------------------------------------------------------------
  124. //         Local definitions
  125. //------------------------------------------------------------------------------
  126. /// TWI peripheral redefinition if needed
  127. #if !defined(AT91C_BASE_TWI) && defined(AT91C_BASE_TWI0)
  128.     #define AT91C_BASE_TWI      AT91C_BASE_TWI0
  129.     #define AT91C_ID_TWI        AT91C_ID_TWI0
  130.     #define PINS_TWI            PINS_TWI0
  131. #endif
  132. /// TWI clock frequency in Hz.
  133. #define TWCK            400000
  134. /// Slave address of AT24C chips.
  135. #define AT24C_ADDRESS   0x50
  136. /// Page size of an AT24C1024 chip (in bytes)
  137. #define PAGE_SIZE       256
  138. //------------------------------------------------------------------------------
  139. //         Local variables
  140. //------------------------------------------------------------------------------
  141. /// Pio pins to configure.
  142. static const Pin pins[] = {PINS_TWI};
  143. /// TWI driver instance.
  144. static Twid twid;
  145. /// Page buffer.
  146. static unsigned char pData[PAGE_SIZE];
  147. //------------------------------------------------------------------------------
  148. ///        Local functions
  149. //------------------------------------------------------------------------------
  150. //------------------------------------------------------------------------------
  151. /// TWI interrupt handler. Forwards the interrupt to the TWI driver handler.
  152. //------------------------------------------------------------------------------
  153. void ISR_Twi(void)
  154. {
  155.     TWID_Handler(&twid);
  156. }
  157. //------------------------------------------------------------------------------
  158. /// Dummy callback, to test asynchronous transfer modes.
  159. //------------------------------------------------------------------------------
  160. void TestCallback()
  161. {
  162.     printf("-I- Callback fired !nr");
  163. }
  164. //------------------------------------------------------------------------------
  165. ///        Global functions
  166. //------------------------------------------------------------------------------
  167. //------------------------------------------------------------------------------
  168. /// Main function
  169. //------------------------------------------------------------------------------
  170. int main()
  171. {
  172.     unsigned int i;
  173.     Async async;
  174.     unsigned int numErrors;
  175.     PIO_Configure(pins, PIO_LISTSIZE(pins));
  176.     TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
  177.     printf("-- Basic TWI EEPROM Project %s --nr", SOFTPACK_VERSION);
  178.     printf("-- %snr", BOARD_NAME);
  179.     printf("-- Compiled: %s %s --nr", __DATE__, __TIME__);
  180.     // Configure TWI
  181.     // In IRQ mode: to avoid problems, the priority of the TWI IRQ must be max.
  182.     // In polling mode: try to disable all IRQs if possible.
  183.     // (in this example it does not matter, there is only the TWI IRQ active)
  184.     AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TWI;
  185.     TWI_ConfigureMaster(AT91C_BASE_TWI, TWCK, BOARD_MCK);
  186.     TWID_Initialize(&twid, AT91C_BASE_TWI);
  187.     AIC_ConfigureIT(AT91C_ID_TWI, 0, ISR_Twi);
  188.     AIC_EnableIT(AT91C_ID_TWI);
  189.     // Erase page #0 and #1
  190.     memset(pData, 0, PAGE_SIZE);
  191.     printf("-I- Filling page #0 with zeroes ...nr");
  192.     TWID_Write(&twid, AT24C_ADDRESS, 0x0000, 2, pData, PAGE_SIZE, 0);
  193.     // Wait at least 10 ms
  194.     for (i=0; i < 1000000; i++);
  195.     printf("-I- Filling page #1 with zeroes ...nr");
  196.     TWID_Write(&twid, AT24C_ADDRESS, 0x0100, 2, pData, PAGE_SIZE, 0);
  197.     // Wait at least 10 ms
  198.     for (i=0; i < 1000000; i++);
  199.     // Synchronous operation
  200.     printf("-I- Read/write on page #0 (polling mode)nr");
  201.     // Write checkerboard pattern in first page
  202.     for (i=0; i < PAGE_SIZE; i++) {
  203.         // Even
  204.         if ((i & 1) == 0) {
  205.         
  206.             pData[i] = 0xA5;
  207.         }
  208.         // Odd
  209.         else {
  210.             pData[i] = 0x5A;
  211.         }
  212.     }
  213.     TWID_Write(&twid, AT24C_ADDRESS, 0x0000, 2, pData, PAGE_SIZE, 0);
  214.     // Wait at least 10 ms
  215.     for (i=0; i < 1000000; i++);
  216.     // Read back data
  217.     memset(pData, 0, PAGE_SIZE);
  218.     TWID_Read(&twid, AT24C_ADDRESS, 0x0000, 2, pData, PAGE_SIZE, 0);
  219.     // Compare
  220.     numErrors = 0;
  221.     for (i=0; i < PAGE_SIZE; i++) {
  222.         // Even
  223.         if (((i & 1) == 0) && (pData[i] != 0xA5)) {
  224.             printf("-E- Data mismatch at offset #%u: expected 0xA5, read 0x%02Xnr", i, pData[i]);
  225.             numErrors++;
  226.         }
  227.         // Odd
  228.         else if (((i & 1) == 1) && (pData[i] != 0x5A)) {
  229.             printf("-E- Data mismatch at offset #%u: expected 0x5A, read 0x%02Xnr", i, pData[i]);
  230.             numErrors++;
  231.         }
  232.     }
  233.     printf("-I- %u comparison error(s) foundnr", numErrors);
  234.     // Asynchronous operation
  235.     printf("-I- Read/write on page #1 (IRQ mode)nr");
  236.     // Write checkerboard pattern in first page
  237.     for (i=0; i < PAGE_SIZE; i++) {
  238.         // Even
  239.         if ((i & 1) == 0) {
  240.         
  241.             pData[i] = 0xA5;
  242.         }
  243.         // Odd
  244.         else {
  245.             pData[i] = 0x5A;
  246.         }
  247.     }
  248.     memset(&async, 0, sizeof(async));
  249.     async.callback = (void *) TestCallback;
  250.     TWID_Write(&twid, AT24C_ADDRESS, 0x0100, 2, pData, PAGE_SIZE, &async);
  251.     while (!ASYNC_IsFinished(&async));
  252.     // Wait at least 10 ms
  253.     for (i=0; i < 1000000; i++);
  254.     // Read back data
  255.     memset(pData, 0, PAGE_SIZE);
  256.     memset(&async, 0, sizeof(async));
  257.     async.callback = (void *) TestCallback;
  258.     TWID_Read(&twid, AT24C_ADDRESS, 0x0100, 2, pData, PAGE_SIZE, &async);
  259.     while (!ASYNC_IsFinished(&async));
  260.     // Compare
  261.     numErrors = 0;
  262.     for (i=0; i < PAGE_SIZE; i++) {
  263.         // Even
  264.         if (((i & 1) == 0) && (pData[i] != 0xA5)) {
  265.             printf("-E- Data mismatch at offset #%u: expected 0xA5, read 0x%02Xnr", i, pData[i]);
  266.             numErrors++;
  267.         }
  268.         // Odd
  269.         else if (((i & 1) == 1) && (pData[i] != 0x5A)) {
  270.             printf("-E- Data mismatch at offset #%u: expected 0x5A, read 0x%02Xnr", i, pData[i]);
  271.             numErrors++;
  272.         }
  273.     }
  274.     printf("-I- %u comparison error(s) foundnr", numErrors);
  275.     return 0;
  276. }