#include "PICi2c.h"
#include "iodefine.h"
#include "cpu.h"
extern cpu CPU;
/* ----------------------------------------------------------------------
PIC_sendByte
PIC のレジスタに1バイト送信する
---------------------------------------------------------------------- */
void PICi2c::PIC_sendByte(unsigned reg, unsigned dt) {
unsigned char rdt;
i2c_waitBusFree(); // i2c バス空き待ち
do {
i2c_setTransmitMode(3); // マスタ送信モード
i2c_sendStartCondition(); // i2c バスを開始条件にする
rdt = i2c_sendByte(PIC_WRITE); // スレーブアドレスを送信
} while(rdt == 1); // デバイスからACKが返るまでガンバル
i2c_sendByte(reg); // レジスタ番号を送信
i2c_sendByte(dt); // データを送信
IIC2.ICSR.BIT.TEND = 0;
i2c_sendStopCondition(); // i2c バスを停止条件にする。
i2c_setTransmitMode(0); // スレーブ受信モードにする
}
/* ----------------------------------------------------------------------
PIC_readByte
PIC のレジスタから1バイト受信する
---------------------------------------------------------------------- */
unsigned char PICi2c::PIC_readByte(unsigned reg) {
unsigned char rdt;
i2c_waitBusFree(); // i2c バス空き待ち
do {
i2c_setTransmitMode(3); // マスタ送信モード
i2c_sendStartCondition(); // i2c バスを開始条件にする
rdt = i2c_sendByte(PIC_WRITE); // スレーブアドレスを送信
} while(rdt == 1); // デバイスからACKが返るまでガンバル
i2c_sendByte(reg); // レジスタ番号を送信
i2c_setTransmitMode(3); // マスタ送信モード
i2c_sendStartCondition(); // i2c バスを開始条件にする
i2c_sendByte(PIC_READ); // スレーブアドレスを送信
i2c_setTransmitMode(2); // マスタ受信モード
IIC2.ICSR.BIT.TDRE = 0;
rdt = i2c_receiveByte(1, 1); // ACK=1, RCVD = 1で受信する。
i2c_sendStopCondition(); // i2c バスを停止条件にする。
IIC2.ICCR1.BIT.RCVD = 0;
i2c_setTransmitMode(0); // スレーブ受信モードにする
return(rdt);
}
/* ----------------------------------------------------------------------
PIC_getData
PIC からデータをnバイト受信する
---------------------------------------------------------------------- */
int PICi2c::PIC_getData(unsigned func, unsigned param, unsigned char Data[], unsigned n)
{
int i, n1;
unsigned char rdt;
n1 = n-1;
i2c_waitBusFree(); // i2c バス空き待ち
i=0;
do {
i2c_setTransmitMode(3); // マスタ送信モード
i2c_sendStartCondition(); // i2c バスを開始条件にする
rdt = i2c_sendByte(PIC_WRITE); // スレーブアドレスを送信
if(i++ == 1000) { // 返事が無かったらあきらめる
//break;
i2c_sendStopCondition(); // i2c バスを停止条件にする。
i2c_setTransmitMode(0); // スレーブ受信モードにする
return 2;
}
} while(rdt == 1); // デバイスからACKが返るまでガンバル
i2c_sendByte(func); // レジスタ番号を送信
i2c_sendByte(param);
i2c_sendStartCondition(); // i2c バスを開始条件にする
i2c_sendByte(PIC_READ); // スレーブアドレスを送信
i2c_setTransmitMode(2); // マスタ受信モード
for(i=0; i< n; i++) {
IIC2.ICSR.BIT.TDRE = 0;
if(i==n1) Data[i] = i2c_receiveByte(1, 1); // ACK=1, RCVD = 1で受信する。
else Data[i] = i2c_receiveByte(0, 0);
IIC2.ICCR1.BIT.RCVD = 0;
}
i2c_sendStopCondition(); // i2c バスを停止条件にする。
i2c_setTransmitMode(0); // スレーブ受信モードにする
return 0;
}
int PICi2c::PIC_getData(unsigned func, unsigned param)
{
PIC_getData(func, param, rdata, 1);
return rdata[0];
}
int PICi2c::PIC_putchar(unsigned char ch){
int x= PIC_getData(0x30, ch, rdata, 1);
do {
PIC_getData(0, 0, rdata, 1);
} while(rdata[0]);
for(int j=0; j<200; j++) CPU.delay(60000);
return x;
}
int PICi2c::PIC_putString(unsigned char* ch){
int i, x;
for(i=0; ch[i]!=0; i++)
PIC_getData(0x40+i, ch[i], rdata, 1);
x = PIC_getData(0x31, 0, rdata, 1);
return x;
}
int PICi2c::PIC_CheckStatus(){
PIC_getData(0, 0, rdata, 1);
return rdata[0];
}
void PICi2c::PIC_SWsetup(){
PIC_getData(0x01, 0, rdata, 1);
}
int PICi2c::PIC_SW(){
PIC_getData(0x02, 0, rdata, 1);
return rdata[0];
}
void PICi2c::PIC_EEPROMwrite(unsigned char adr, unsigned char data)
{
PIC_getData(0x60, adr, rdata, 3);
tm.waitUS(1500);
PIC_getData(0x61, data, rdata, 3);
do{
PIC_getData(0, data, rdata, 3);
} while(rdata[0]);
}
unsigned char PICi2c::PIC_EEPROMread(unsigned char adr)
{
PIC_getData(0x60, adr, rdata, 3);
tm.waitUS(1500);
PIC_getData(0x62, adr, rdata, 3);
do{
PIC_getData(0, adr, rdata, 3);
} while(rdata[0]);
return rdata[1];
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|