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

📄 i2c.c

📁 JPEG压缩编码在TMS320VC5509的实现代码。使用编译器为ccs2.2
💻 C
字号:
//i2c.c
#include "BasicDefinition.h"
#define K_RECEIVE_SIZE 64

BYTE Buffer[128];

void I2cInitForAic23(void)
{
	I2CMDR1 = 0x4e20;
	
	I2COAR = 0x0000;//don't care if master。当从模式时表示DSP的slaveaddress
	
	I2CPSC = 0x2056;
	
	I2CCLKL = 0x0f;
	
	I2CCLKH = 0x0f;	

	I2CMDR1 |= 0x200;//TRX位设置为1,即设置为传输模式

	I2CCNT = 2;//发送长度为2字节,Aic23的命令长度为1个字

	I2CSAR = 0x1a;//设置从设备的地址 

	I2CMDR1 |= 0x400;//MST设置为1,打开主模式

	//第1种传输模式 // S-A-D..(n)..D-P mode

	//I2CMDR1 &= 0xff7f;//RM位为0,不使用重复模式 

	//I2CMDR1 |= 0x0800;//STP位为1,有自动停止位
}


int I2cWriteAic23(unsigned int *data)
{
	unsigned int i,j; 
	unsigned int m_nStatus = 1;
  

	I2CMDR1 |= 0x0e00;
	
	for(j=0;j<30;j++)
	{
		for (i=0;i<K_TIME_OUT;i++)//check for bus busy
		{
			m_nStatus = I2CSTR & 0x1000;//通过BB位来判断是否Busy
			if(m_nStatus == 0)break; 
		}
	}
  
	if(i >= K_TIME_OUT)//bus busy timeout error
		return 1;  
  
	I2CDXR = *data++;//传输第1个数

	I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
	                
	for (i=0;i<K_TIME_OUT;i++)//check for NACK status
	{
		m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
		if(m_nStatus == 0)break; 
	}
    
	if(i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
		return 3;
  
	for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
	{
		m_nStatus = I2CSTR & 0x0010;
		if(m_nStatus == 0x0010)break;     
	}
      
	if(i >= K_TIME_OUT)//time out for transmit DXR ready
		return 4;
  	
    I2CDXR = *data++;//传输第2个数
   
    for(j=0;j<30;j++)
    {
		for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
		{
			m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
			if(m_nStatus == 0)break; 
		}
	}
	    
	if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
		return 5;                                                            
    
    return 0;  
}


void I2cInitForEEPROM(void)
{
	I2CMDR1 = 0x4620;
	
	I2COAR = 0x0000;//don't care if master。当从模式时表示DSP的slaveaddress
	
	I2CPSC = 0x2056;
	
	I2CCLKL = 0x3f;
	
	I2CCLKH = 0x3f;	

	I2CMDR1 |= 0x200;//TRX位设置为1,即设置为传输模式

	//I2CCNT = 1;

	I2CSAR = 0x50;//设置从设备的地址 

	I2CMDR1 |= 0x400;//MST设置为1,打开主模式

	//第1种传输模式 // S-A-D..(n)..D-P mode

	//I2CMDR1 &= 0xff7f;//RM位为0,不使用重复模式

	I2CMDR1 |= 0x0800;//STP位为1,有自动停止位
}


UINT SequentialRead(FILE* fp,UINT FileSize)
{
	unsigned int i,j; 
	unsigned int m_nStatus = 0;
	
	BYTE TmpBuf1,TmpBuf2;
	
	UINT m_bError = 0;//没有错误

	I2CMDR1 = 0x4420;
	
	I2CCNT = FileSize;//接收10个字节
			
	I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
	
	for(j=0;j<FileSize;j++)
	{
		for (i=0;i<K_TIME_OUT;i++)//check for DRR status,看接收寄存器是否已经收到数据
		{
			m_nStatus = I2CSTR & 0x0008;
			if(m_nStatus == 0x0008)break;
		}
		
		if(i >= K_TIME_OUT)//time out for transmit DXR ready
			return 0xffff;
			
		TmpBuf1 = I2CDRR;
		
		TmpBuf2 = fgetc(fp);
		if(TmpBuf1 != TmpBuf2)
			m_bError = 0xfffe;
	}
	
	I2CMDR1 |= 0x0800;//STP位设置为1,产生停止条件
	
	return m_bError;
}


UINT AT24SetAddress(UINT DataAddr)
{
	UINT i; 
	UINT m_nStatus = 1;
	
	UINT TmpBufAddr = DataAddr;
	
	I2CMDR1 = 0x4620;//注意不要STOP
	
	I2CCNT = 2;
	
	//I2CMDR1 |= 0x0e00;
	
	for (i=0;i<K_TIME_OUT;i++)//check for bus busy
	{
 		m_nStatus = I2CSTR & 0x1000;//通过BB位来判断是否Busy
		if(m_nStatus == 0)break; 
	}

  
	if(i >= K_TIME_OUT)//bus busy timeout error
		return 1;  
  
	I2CDXR = (BYTE)(TmpBufAddr>>8);//((BYTE*)(&TmpBufAddr))[1];//传输第1个数

	I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
	                
	for (i=0;i<K_TIME_OUT;i++)//check for NACK status
	{
		m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
		if(m_nStatus == 0)break; 
	}
    
	if(i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
		return 3;
  
	for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
	{
		m_nStatus = I2CSTR & 0x0010;
		if(m_nStatus == 0x0010)break;     
	}
      
	if(i >= K_TIME_OUT)//time out for transmit DXR ready
		return 4;
  	
    I2CDXR = (BYTE)(TmpBufAddr);//((BYTE*)(&TmpBufAddr))[0];//传输第2个数
   
	for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
	{
		m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
		if(m_nStatus == 0)break; 
	}
	    
	if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
		return 5;                                                            
    
    return 0;
}

UINT AT24PageWrite(BYTE* InputBuf,UINT addr)
{
	unsigned int i,j; 
	unsigned int m_nStatus;
	UINT TmpAddr = addr;
  

	I2CMDR1 |= 0x0e00;
	
	I2CCNT = K_CURRENT_PAGE_SIZE + 2;//发送数据的长度(包括了地址)
	
	for(j=0;j<30;j++)
	{
		for (i=0;i<K_TIME_OUT;i++)//check for bus busy
		{
			m_nStatus = I2CSTR & 0x1000;//通过BB位来判断是否Busy
			if(m_nStatus == 0)break; 
		}
	}
  
	if(i >= K_TIME_OUT)//bus busy timeout error
		return 1;  

	I2CDXR = (BYTE)(TmpAddr>>8);//((BYTE*)(&TmpAddr))[0];//0x00;//写地址的高位

	I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
	                
	for (i=0;i<K_TIME_OUT;i++)//check for NACK status
	{
		m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
		if(m_nStatus == 0)break;
	}
    
	if(i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
		return 3;
  
	for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
	{
		m_nStatus = I2CSTR & 0x0010;
		if(m_nStatus == 0x0010)break;     
	}
      
	if(i >= K_TIME_OUT)//time out for transmit DXR ready
		return 4;
 
  	 	


    I2CDXR = (BYTE)(TmpAddr);//((BYTE*)(&TmpAddr))[1];//0x00;//写地址的低位
   
	for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
	{
		m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
		if(m_nStatus == 0)break; 
	}
	    
	if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
		return 5;  
		
	for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
	{
		m_nStatus = I2CSTR & 0x0010;
		if(m_nStatus == 0x0010)break;     
	}
      
	if(i >= K_TIME_OUT)//time out for transmit DXR ready
		return 4;




	for(j=0;j<K_CURRENT_PAGE_SIZE;j++)//写剩余的数据
	{
    	I2CDXR = *InputBuf++;
   
		for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
		{
			m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
			if(m_nStatus == 0)break; 
		}
	    
		if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
			return 5;  
		
		for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
		{
			m_nStatus = I2CSTR & 0x0010;
			if(m_nStatus == 0x0010)break;     
		}
      
		if(i >= K_TIME_OUT)//time out for transmit DXR ready
			return 4;
	}	                                                          
    
    return 0;  
}

void CheckProgStatus(void)
{
	UINT i;
	UINT m_bIdle = 0;
	UINT m_nStatus;
	
	I2CMDR1 |= 0x0e00;
	
	I2CMDR1 &= 0xf7ff;
	
	I2CCNT = 0;	
	
	I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
	
	while(1)
	{
		for (i=0;i<K_TIME_OUT;i++)//check for NACK status
		{
			m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
			if(m_nStatus == 0)
			{
				m_bIdle = 1;
				break;
			}
		}
		if(m_bIdle == 0)
			I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
		else
		{
			generate_stop_condition;
			break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -