OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [i2cmst.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/*
2
 * Test application for I2CMST
3
 *
4
 * Copyright (c) 2008 Gaisler Research AB
5
 *
6
 * This test requires that the I2C bus is pulled HIGH and
7
 * that a memory model with address 0x50 is attached to the
8
 * bus. The prescale register is by default set to 0x0003
9
 * which means that correct I2C timing will likely not be
10
 * attained.
11
 *
12
 */
13
 
14
#include "testmod.h"
15
 
16
/* Register fields */
17
/* Control register */
18
#define CTR_EN  (1 << 7)  /* Enable core */
19
#define CTR_IEN (1 << 6)  /* Interrupt enable */
20
/* Command register */
21
#define CR_STA (1 << 7)   /* Generate start condition */
22
#define CR_STO (1 << 6)   /* Generate stop condition */
23
#define CR_RD  (1 << 5)   /* Read from slave */
24
#define CR_WR  (1 << 4)   /* Write to slave */
25
#define CR_ACK (1 << 3)   /* ACK, when a receiver send ACK (ACK = 0) 
26
                             or NACK (ACK = 1) */
27
#define CR_IACK (1 << 0)  /* Interrupt acknowledge */
28
/* Status register */
29
#define SR_RXACK (1 << 7) /* Receibed acknowledge from slave */
30
#define SR_BUSY  (1 << 6) /* I2C bus busy */
31
#define SR_AL    (1 << 5) /* Arbitration lost */
32
#define SR_TIP   (1 << 1) /* Transfer in progress */
33
#define SR_IF    (1 << 0) /* Interrupt flag */
34
 
35
/* Reset values */
36
#define PRER_RESVAL 0xffff
37
#define CTR_RESVAL  0
38
#define RXR_RESVAL  0
39
#define SR_RESVAL   0
40
 
41
#define PRESCALER   0x0003
42
 
43
#define I2CMEM_ADDR 0x50
44
#define TEST_DATA   0x55
45
 
46
struct i2cmstregs {
47
  volatile unsigned int prer;
48
  volatile unsigned int ctr;
49
  volatile unsigned int xr;
50
  volatile unsigned int csr;
51
};
52
 
53
/*
54
 * i2cmst_test(int addr)
55
 *
56
 * Checks register reset values
57
 * Writes one byte and then reads it back.
58
 *
59
 */
60
int i2cmst_test(int addr)
61
{
62
  int i;
63
 
64
  struct i2cmstregs *regs;
65
 
66
  report_device(0x01028000);
67
  report_subtest(1);
68
 
69
  /* Check register reset values */
70
  if (regs->prer != PRER_RESVAL)
71
    fail(0);
72
 
73
  if (regs->ctr != CTR_RESVAL)
74
    fail(1);
75
 
76
  if (regs->xr != RXR_RESVAL)
77
    fail(2);
78
 
79
  if (regs->csr != SR_RESVAL)
80
    fail(3);
81
 
82
  report_subtest(2);
83
 
84
  regs->prer = PRESCALER;
85
 
86
  regs->ctr = CTR_EN;
87
 
88
  for (i = 0; i < 6; i++) {
89
    switch(i) {
90
    case 0:
91
      /* Address memory */
92
      regs->xr = I2CMEM_ADDR << 1;
93
      regs->csr = CR_STA | CR_WR;
94
      break;
95
    case 1:
96
      /* Select memory position 0 */
97
      regs->xr = 0;
98
      regs->csr = CR_WR;
99
      break;
100
    case 2:
101
      /* Write data to position 0 */
102
      regs->xr = TEST_DATA;
103
      regs->csr = CR_WR | CR_STO;
104
      break;
105
    case 3:
106
      /* Address memory */
107
      regs->xr = I2CMEM_ADDR << 1;
108
      regs->csr = CR_STA | CR_WR;
109
      break;
110
    case 4:
111
      /* Select memory position 0 */
112
      regs->xr = 0;
113
      regs->csr = CR_WR;
114
      break;
115
    case 5:
116
      /* Address memory for reading */
117
      regs->xr = (I2CMEM_ADDR << 1) | 1;
118
      regs->csr = CR_STA | CR_WR;
119
      break;
120
    default:
121
      break;
122
    }
123
 
124
    while (regs->csr & SR_TIP)
125
      ;
126
 
127
    if (regs->csr & SR_RXACK) {
128
      fail(4+i);
129
      goto i2cmstfail;
130
    }
131
    if (regs->csr & SR_AL) {
132
      fail(9+i);
133
      goto i2cmstfail;
134
    }
135
  }
136
 
137
  /* Read from memory and NAK*/
138
  regs->csr = CR_RD | CR_STO | CR_ACK;
139
 
140
  while (regs->csr & SR_TIP)
141
    ;
142
 
143
  if (regs->xr != TEST_DATA)
144
    fail(15);
145
 
146
 i2cmstfail:
147
 
148
  regs->ctr = 0;
149
 
150
  return 0;
151
 
152
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.