@@ -47,6 +47,25 @@ void I2C_start() {
4747 SCL_SET (0 );
4848 DELAY_Q ;
4949}
50+ void I2C_start_cs () {
51+ if (I2C_EN != 1 )
52+ return ;
53+
54+ SDA_SET (1 );
55+ DELAY_Q ;
56+
57+ SCL_SET (1 );
58+ while (SCL_GET () != 1 )
59+ SCL_SET (1 );
60+ DELAY_Q ;
61+
62+ SDA_SET (0 );
63+ DELAY_Q ;
64+ DELAY_Q ;
65+
66+ SCL_SET (0 );
67+ DELAY_Q ;
68+ }
5069
5170void I2C_stop () {
5271 if (I2C_EN != 1 )
@@ -63,6 +82,22 @@ void I2C_stop() {
6382 DELAY_Q ;
6483}
6584
85+ void I2C_stop_cs () {
86+ if (I2C_EN != 1 )
87+ return ;
88+
89+ SDA_SET (0 );
90+ DELAY_Q ;
91+
92+ while (SCL_GET () != 1 )
93+ SCL_SET (1 );
94+ DELAY_Q ;
95+
96+ SDA_SET (1 );
97+ DELAY_Q ;
98+ DELAY_Q ;
99+ }
100+
66101uint8_t I2C_ack () {
67102 uint8_t ret ;
68103
@@ -83,6 +118,27 @@ uint8_t I2C_ack() {
83118 return ret ;
84119}
85120
121+ uint8_t I2C_ack_cs () {
122+ uint8_t ret ;
123+
124+ if (I2C_EN != 1 )
125+ return 1 ;
126+
127+ SDA_SET (1 );
128+ DELAY_Q ;
129+
130+ while (SCL_GET () != 1 )
131+ SCL_SET (1 );
132+ ret = SDA_GET ();
133+ DELAY_Q ;
134+ DELAY_Q ;
135+
136+ SCL_SET (0 );
137+ DELAY_Q ;
138+
139+ return ret ;
140+ }
141+
86142uint8_t I2C_write_byte (uint8_t val ) {
87143 uint8_t i ;
88144
@@ -110,6 +166,34 @@ uint8_t I2C_write_byte(uint8_t val) {
110166
111167 return i ;
112168}
169+ uint8_t I2C_write_byte_cs (uint8_t val ) {
170+ uint8_t i ;
171+
172+ if (I2C_EN != 1 )
173+ return 1 ;
174+
175+ for (i = 0 ; i < 8 ; i ++ ) {
176+ if (val >> 7 )
177+ SDA_SET (1 );
178+ else
179+ SDA_SET (0 );
180+ DELAY_Q ;
181+
182+ while (SCL_GET () != 1 )
183+ SCL_SET (1 );
184+ DELAY_Q ;
185+ DELAY_Q ;
186+
187+ SCL_SET (0 );
188+ DELAY_Q ;
189+
190+ val <<= 1 ;
191+ }
192+
193+ i = I2C_ack ();
194+
195+ return i ;
196+ }
113197
114198uint8_t I2C_Write8 (uint8_t slave_addr , uint8_t reg_addr , uint8_t val ) {
115199 uint8_t slave = slave_addr << 1 ;
@@ -234,6 +318,43 @@ uint8_t I2C_read_byte(uint8_t no_ack) {
234318
235319 return val ;
236320}
321+ uint8_t I2C_read_byte_cs (uint8_t no_ack ) {
322+ uint8_t i ;
323+ uint8_t val = 0 ;
324+
325+ if (I2C_EN != 1 )
326+ return 0 ;
327+
328+ for (i = 0 ; i < 8 ; i ++ ) {
329+ DELAY_Q ;
330+ while (SCL_GET () != 1 )
331+ SCL_SET (1 );
332+
333+ val <<= 1 ;
334+ val |= SDA_GET ();
335+
336+ DELAY_Q ;
337+ DELAY_Q ;
338+
339+ SCL_SET (0 );
340+ DELAY_Q ;
341+ }
342+
343+ // master ack
344+ SDA_SET (no_ack );
345+ DELAY_Q ;
346+ while (SCL_GET () != 1 )
347+ SCL_SET (1 );
348+ DELAY_Q ;
349+ DELAY_Q ;
350+
351+ SCL_SET (0 );
352+ DELAY_Q ;
353+
354+ SDA_SET (1 );
355+
356+ return val ;
357+ }
237358
238359uint8_t I2C_Read8 (uint8_t slave_addr , uint8_t reg_addr ) {
239360 uint8_t slave , val ;
@@ -367,6 +488,29 @@ uint8_t RUNCAM_Write(uint8_t cam_id, uint32_t addr, uint32_t val) {
367488 return 0 ;
368489}
369490
491+ uint8_t RUNCAM_Write8 (uint8_t cam_id , uint32_t addr , uint32_t val ) {
492+ uint8_t value ;
493+
494+ I2C_start (); // start
495+
496+ value = I2C_write_byte (cam_id ); // slave
497+ if (value ) {
498+ I2C_stop ();
499+ return 1 ;
500+ }
501+ value = addr & 0xFF ; // ADDR[7:0]
502+ I2C_write_byte (value );
503+
504+ value = val & 0xFF ; // DATA[7:0]
505+ I2C_write_byte (value );
506+
507+ I2C_stop (); // stop
508+
509+ WAIT (10 );
510+
511+ return 0 ;
512+ }
513+
370514uint32_t RUNCAM_Read (uint8_t cam_id , uint32_t addr ) {
371515 uint8_t value ;
372516 uint32_t ret = 0 ;
@@ -408,6 +552,47 @@ uint32_t RUNCAM_Read(uint8_t cam_id, uint32_t addr) {
408552
409553 return ret ;
410554}
555+ uint32_t RUNCAM_Read_cs (uint8_t cam_id , uint32_t addr ) {
556+ uint8_t value ;
557+ uint32_t ret = 0 ;
558+
559+ I2C_start_cs (); // start
560+
561+ I2C_write_byte_cs (cam_id ); // slave
562+
563+ I2C_write_byte_cs (0x13 ); // read cmd
564+
565+ value = (addr >> 16 ) & 0xFF ; // ADDR[23:16]
566+ I2C_write_byte_cs (value );
567+
568+ value = (addr >> 8 ) & 0xFF ; // ADDR[15:8]
569+ I2C_write_byte_cs (value );
570+
571+ value = addr & 0xFF ; // ADDR[7:0]
572+ I2C_write_byte_cs (value );
573+
574+ I2C_start_cs (); // start
575+
576+ I2C_write_byte_cs (cam_id | 0x01 ); // slave | 0x01
577+
578+ value = I2C_read_byte_cs (0 ); // read DATA[31:24]
579+ ret = (ret << 8 ) | value ;
580+
581+ value = I2C_read_byte_cs (0 ); // read DATA[23:16]
582+ ret = (ret << 8 ) | value ;
583+
584+ value = I2C_read_byte_cs (0 ); // read DATA[15:8]
585+ ret = (ret << 8 ) | value ;
586+
587+ value = I2C_read_byte_cs (1 ); // read DATA[7:0]
588+ ret = (ret << 8 ) | value ;
589+
590+ I2C_stop_cs (); // stop
591+
592+ WAIT (10 );
593+
594+ return ret ;
595+ }
411596
412597/*
413598 [return]
0 commit comments