📄 test2.c
字号:
#define CHIP_DM642 1#define OV7640_R_ADDRESS 0x43#define OV7640_W_ADDRESS 0x42#include <csl.h>#include <csl_i2c.h>#include <csl_emifa.h>#include <stdio.h>CHIP_Config chippercfg = { CHIP_I2C+CHIP_VP1,};EMIFA_Config emifaCfg0 = {// EMIFA_FMKS(GBLCTL, EK2RATE, HALFCLK) |// EMIFA_FMKS(GBLCTL, EK2HZ, CLK) |// EMIFA_FMKS(GBLCTL, EK2EN, ENABLE) | EMIFA_FMKS(GBLCTL, BRMODE, MRSTATUS) | EMIFA_FMKS(GBLCTL, NOHOLD, DISABLE) | EMIFA_FMKS(GBLCTL, EK1HZ, HIGHZ) | EMIFA_FMKS(GBLCTL, EK1EN, ENABLE),// EMIFA_FMKS(GBLCTL, CLK4EN, ENABLE) |// EMIFA_FMKS(GBLCTL, CLK6EN, ENABLE), EMIFA_FMKS(CECTL, WRSETUP, DEFAULT) | EMIFA_FMKS(CECTL, WRSTRB, DEFAULT) | EMIFA_FMKS(CECTL, WRHLD, DEFAULT) | EMIFA_FMKS(CECTL, RDSETUP, DEFAULT) | EMIFA_FMKS(CECTL, TA, DEFAULT) | EMIFA_FMKS(CECTL, RDSTRB, DEFAULT) | EMIFA_FMKS(CECTL, MTYPE, SDRAM64) | EMIFA_FMKS(CECTL, RDHLD, DEFAULT), EMIFA_FMKS(CECTL, WRSETUP, OF(7)) | EMIFA_FMKS(CECTL, WRSTRB, OF(14)) | EMIFA_FMKS(CECTL, WRHLD, OF(2)) | EMIFA_FMKS(CECTL, RDSETUP, OF(2)) | EMIFA_FMKS(CECTL, TA, OF(2)) | EMIFA_FMKS(CECTL, RDSTRB, OF(14)) | EMIFA_FMKS(CECTL, MTYPE, ASYNC8) | EMIFA_FMKS(CECTL, RDHLD, OF(1)), EMIFA_CECTL_DEFAULT, EMIFA_CECTL_DEFAULT, EMIFA_FMKS(SDCTL, SDBSZ, 4BANKS) | EMIFA_FMKS(SDCTL, SDRSZ, 12ROW) | EMIFA_FMKS(SDCTL, SDCSZ, 8COL) | EMIFA_FMKS(SDCTL, RFEN, ENABLE) | EMIFA_FMKS(SDCTL, INIT, YES) | EMIFA_FMKS(SDCTL, TRCD, OF(1)) | EMIFA_FMKS(SDCTL, TRP, OF(1)) | EMIFA_FMKS(SDCTL, TRC, OF(5)) | EMIFA_FMKS(SDCTL, SLFRFR, DISABLE), EMIFA_FMKS(SDTIM, XRFR, OF(0)) | EMIFA_FMKS(SDTIM, PERIOD, OF(2075)), EMIFA_FMKS(SDEXT, WR2RD, OF(1)) | EMIFA_FMKS(SDEXT, WR2DEAC, OF(3)) | EMIFA_FMKS(SDEXT, WR2WR, OF(1)) | EMIFA_FMKS(SDEXT, R2WDQM, OF(3)) | EMIFA_FMKS(SDEXT, RD2WR, OF(2)) | EMIFA_FMKS(SDEXT, RD2DEAC, OF(3)) | EMIFA_FMKS(SDEXT, RD2RD, OF(1)) | EMIFA_FMKS(SDEXT, THZP, OF(2)) | EMIFA_FMKS(SDEXT, TWR, OF(2)) | EMIFA_FMKS(SDEXT, TRRD, OF(0)) | EMIFA_FMKS(SDEXT, TRAS, OF(6)) | EMIFA_FMKS(SDEXT, TCL, OF(1)), EMIFA_CESEC_DEFAULT, EMIFA_CESEC_DEFAULT, EMIFA_CESEC_DEFAULT, EMIFA_CESEC_DEFAULT, };// I2C_Config i2cCfg = {// 0x00000000, /* I2COAR - Not used if master */// 0x00000000, /* I2CIER - Disable interrupts, use polling */// 0x00000014, /* I2CCLKL - Low period for 200KHz operation */// 0x00000014, /* I2CCLKH - High period for 200KHz operation */// 0x00000000, /* I2CCNT - Data words per transmission */// 0x00000000, /* I2CSAR - Slave address */// 0x00004680, /* I2CMDR - Mode */// 0x0000000D /* I2CPSC - Prescale 150MHz to 10MHz */// }; I2C_Handle g_I2C_Handle; // I2C 全局句柄void Delay(Uint8 nClk){ Uint8 loop; for (loop=nClk;loop==1;loop--){}}Bool I2C_Initialize(void){ g_I2C_Handle = I2C_open(I2C_PORT0,I2C_OPEN_RESET); if(g_I2C_Handle == INV) { return FALSE; } else { I2C_RSETH(g_I2C_Handle, I2CPSC, 0x0D); // I2C模块时钟设置为10M 150M/15 I2C_RSETH(g_I2C_Handle, I2CCLKL, 0x14); // 设置I2C外部时钟为100K I2C_RSETH(g_I2C_Handle, I2CCLKH, 0x14); // 设置I2C外部时钟为100K return TRUE; }}Uint8 I2C_Write(Uint8 dev_addr, Uint8 sub_addr, Uint8 *write_buffer, Uint8 write_len){ Uint8 bResult = 0;
while (I2C_bb(g_I2C_Handle));
// clear all interrupt state I2C_FSETH(g_I2C_Handle, I2CSTR, AL, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, NACK, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, ARDY, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, ICRRDY, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, ICXRDY, 1); I2C_RSETH(g_I2C_Handle, I2CCNT, 1+write_len);//length to be writen I2C_RSETH(g_I2C_Handle, I2CSAR, dev_addr); //设置slave的地址 I2C_RSETH(g_I2C_Handle, I2CMDR, I2C_FMKS(I2CMDR, NACKMOD, ACK)| I2C_FMKS(I2CMDR, FREE, BSTOP)| I2C_FMKS(I2CMDR, STT, NONE)| I2C_FMKS(I2CMDR, STP, NONE)| I2C_FMKS(I2CMDR, MST, MASTER)| //Master mode I2C_FMKS(I2CMDR, TRX, XMT)| //Transmitter mode I2C_FMKS(I2CMDR, XA, 7BIT)| I2C_FMKS(I2CMDR, RM, NONE)| //Nonrepeat mode I2C_FMKS(I2CMDR, DLB, NONE)| I2C_FMKS(I2CMDR, IRS, NRST)| I2C_FMKS(I2CMDR, STB, NONE)| I2C_FMKS(I2CMDR, FDF, NONE)| I2C_FMKS(I2CMDR, BC, BIT8FDF));
// I2C_RSETH(g_I2C_Handle, I2CMDR, 0x2E20);
I2C_RSETH(g_I2C_Handle, I2CDXR, sub_addr);
I2C_start(g_I2C_Handle);// send start condition while(1) {
while(I2C_FGETH(g_I2C_Handle,I2CSTR,NACK));// wait NACK to 0 if(I2C_FGETH(g_I2C_Handle,I2CSTR,ARDY))//ARDY == 1 send finish { break;
} else { while(!I2C_FGETH(g_I2C_Handle,I2CSTR,ICXRDY)); // ICXRDY == 1 wait ICXRDY to 1
if(bResult == 0) {
I2C_writeByte(g_I2C_Handle, sub_addr);//传输子地址
// I2C_start(g_I2C_Handle);
bResult ++; } else { I2C_writeByte(g_I2C_Handle, *write_buffer++); //传输数据 bResult ++; }
} } I2C_sendStop(g_I2C_Handle); return bResult;}Uint8 I2C_Read(Uint8 dev_addr, Uint8 sub_addr, Uint8 *read_buffer, Uint8 read_len){ Uint8 bResult = 0; Uint32 I2CState; while (I2C_bb(g_I2C_Handle)); // clear all interrupt state I2C_FSETH(g_I2C_Handle, I2CSTR, AL, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, NACK, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, ARDY, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, ICRRDY, 1); I2C_FSETH(g_I2C_Handle, I2CSTR, ICXRDY, 1); I2C_RSETH(g_I2C_Handle, I2CCNT, 1); I2C_RSETH(g_I2C_Handle, I2CSAR, dev_addr); //设置slave的地址 I2C_RSETH(g_I2C_Handle, I2CMDR, I2C_FMKS(I2CMDR, NACKMOD, ACK)| I2C_FMKS(I2CMDR, FREE, BSTOP)| I2C_FMKS(I2CMDR, STT, NONE)| I2C_FMKS(I2CMDR, STP, NONE)| I2C_FMKS(I2CMDR, MST, MASTER)| //Master mode I2C_FMKS(I2CMDR, TRX, XMT)| //Transmitter mode I2C_FMKS(I2CMDR, XA, 7BIT)| I2C_FMKS(I2CMDR, RM, NONE)| //Nonrepeat mode I2C_FMKS(I2CMDR, DLB, NONE)| I2C_FMKS(I2CMDR, IRS, NRST)| I2C_FMKS(I2CMDR, STB, NONE)| I2C_FMKS(I2CMDR, FDF, NONE)| I2C_FMKS(I2CMDR, BC, BIT8FDF));
I2C_start(g_I2C_Handle);// send start condition while(1) { I2CState = I2C_RGETH(g_I2C_Handle, I2CSTR); if(I2CState & 0x01) { // Arbitration lost // clear AL state in I2C Status Register I2C_FSETH(g_I2C_Handle, I2CSTR, AL, 1); break; }
if(I2CState & 0x02)// NACK == 1 { // clear NACK state in I2C Status Register I2C_FSETH(g_I2C_Handle, I2CSTR, NACK, 1); break;
} if(I2CState & 0x04) { // ARDY == 1 break;
} else { if(I2CState & 0x10) // ICXRDY == 1 { I2C_writeByte(g_I2C_Handle, sub_addr);//传输子地址
} else { } } } I2C_FSETH(g_I2C_Handle, I2CMDR, TRX, 0); // I2C_RSETH(g_I2C_Handle, I2CSAR, dev_addr);// I2C_RSETH(g_I2C_Handle, I2CMDR, 0x24A0); // wait send start condition while(I2C_FGETH(g_I2C_Handle, I2CMDR, STT)); while(1) { I2CState = I2C_RGETH(g_I2C_Handle, I2CSTR); if(I2CState & 0x01) { // Arbitration lost I2C_FSETH(g_I2C_Handle, I2CSTR, AL, 1); break; } if(I2CState & 0x04) { // ARDY == 1 if(I2CState & 0x02) { // NACK == 1 I2C_FSETH(g_I2C_Handle, I2CSTR, NACK, 1); break; } else if(I2CState & 0x2000) { // NACKSNT == 1 I2C_FSETH(g_I2C_Handle, I2CSTR, NACKSNT, 1); break; } else { if(I2CState & 0x08) { // ICRRDY == 1 if(bResult < read_len) { read_buffer[bResult] = I2C_RGETH(g_I2C_Handle, I2CDRR); bResult ++; if(bResult >= read_len) { // 如果收完所有字节 则发送NACK I2C_FSETSH(g_I2C_Handle,I2CMDR,NACKMOD,NACK); } } else { I2C_FSETSH(g_I2C_Handle,I2CMDR,NACKMOD,NACK); I2C_RGETH(g_I2C_Handle, I2CDRR); } } } } } I2C_sendStop(g_I2C_Handle); return bResult;}void main(){// Uint32 gie; Uint8 Result; // Uint8 dev_write_addr=0x42;// Uint8 dev_read_addr=0x43; Uint8 sub_addr=0x0A; Uint8 *write_buffer=(Uint8 *)(0x10000); Uint8 write_len=8; CSL_init();// IRQ_globalDisable(); CHIP_config(&chippercfg); Delay(128); EMIFA_config(&emifaCfg0); I2C_Initialize(); I2C_outOfReset(g_I2C_Handle); // 允许I2C总线// while(1)
// {
Result = I2C_Write(OV7640_W_ADDRESS,sub_addr,write_buffer,write_len);
// }
Result++;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -