⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test2.c

📁 tms320dm642和ov7640通过i2c口通讯的源程序
💻 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 + -