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

📄 twi.c

📁 关于测试at91sam9260的各种驱动和功能的测试源代码。
💻 C
字号:
/*************************************** Copyright (c) *************************************************
*
*			            POLAR STAR
*				   北天星国际有限公司
*				   http://www.po-star.com
*
*文 件 名: lib_audio.c    
*
*文件描述:TWI EEPROM test
*
*编译环境:ADS1.2
*
********************************************************************************************************/

#include "main.h"
#include "twi.h"


//*=========================================================
//*		WRITE
//*=========================================================
//*----------------------------------------------------------------------------
//* \fn    AT91F_TWI_Write
//* \brief Send n bytes to a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Write(const AT91PS_TWI pTwi ,int address, char *data2send, int size)
{
	unsigned int status;

	// Set the TWI Master Mode Register
	pTwi->TWI_MMR = ( AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE ) & ~AT91C_TWI_MREAD;	
	
	// Set TWI Internal Address Register
	pTwi->TWI_IADR = address;

	status = pTwi->TWI_SR;
		
	pTwi->TWI_THR = *(data2send++);
	
	pTwi->TWI_CR = AT91C_TWI_START;
		
	while (size-- >1)
	{
		// Wait THR Holding register to be empty
		while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY));
	
		// Send first byte
		pTwi->TWI_THR = *(data2send++);		
	}

	pTwi->TWI_CR = AT91C_TWI_STOP;		

	status = pTwi->TWI_SR;

	// Wait transfer is finished
    while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP));
		
	return AT91C_EEPROM_WRITE_OK;
}

//*=========================================================
//*		READ
//*=========================================================
//*----------------------------------------------------------------------------
//* \fn    AT91F_TWI_Read
//* \brief Read n bytes from a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Read(const AT91PS_TWI pTwi , int address, char *data, int size)
{
	unsigned int status;
	
	// Set the TWI Master Mode Register
	pTwi->TWI_MMR = AT91C_EEPROM_I2C_ADDRESS | AT91C_TWI_IADRSZ_2_BYTE | AT91C_TWI_MREAD;	
	
	// Set TWI Internal Address Register
	pTwi->TWI_IADR = address;
	
	// Start transfer
	pTwi->TWI_CR = AT91C_TWI_START;
	
	status = pTwi->TWI_SR;
		
	while (size-- >1)
	{	
		// Wait RHR Holding register is full
		while (!(pTwi->TWI_SR & AT91C_TWI_RXRDY));

		// Read byte
		*(data++) = pTwi->TWI_RHR;
	}
	
	pTwi->TWI_CR = AT91C_TWI_STOP;

	status = pTwi->TWI_SR;

	// Wait transfer is finished
    while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP));

	// Read last byte
	*data = pTwi->TWI_RHR;
		
	return AT91C_EEPROM_READ_OK;
}

//*=========================================================
//*		INIT
//*=========================================================
//*----------------------------------------------------------------------------
//* \fn    AT91F_SetTwiClock
//* \brief Initialization
//*----------------------------------------------------------------------------
void AT91F_SetTwiClock(const AT91PS_TWI pTwi)
{
	int sclock;

	/* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/

	sclock = (10*AT91C_MASTER_CLOCK /AT91C_TWI_CLOCK);
	if (sclock % 10 >= 5)
		sclock = (sclock /10) - 5;
	else
		sclock = (sclock /10)- 6;
	sclock = (sclock + (4 - sclock %4)) >> 2;	// div 4

    pTwi->TWI_CWGR	= 0x00010000 | sclock | (sclock << 8);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_TestTWI_EEPROM
//* \brief 
//*----------------------------------------------------------------------------
void AT91F_TestTWI_EEPROM(void)
{
	int loop;
	
	unsigned short write, read;
	
	AT91F_DBGU_Printk("\n\r-I- Step 9. TWI/EEPROM Test\n\r");
	
	// Configure TWI PIOs
	AT91F_TWI_CfgPIO ();
	AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA, (unsigned int) AT91C_PA23_TWD);

	// Configure PMC by enabling TWI clock
	AT91F_TWI_CfgPMC ();
	
	// Configure TWI in master mode
	AT91F_TWI_Configure (AT91C_BASE_TWI);
		
	// Set TWI Clock Waveform Generator Register	
	AT91F_SetTwiClock(AT91C_BASE_TWI);

	write = 0xAA55;

	// Write a byte and read it 
	AT91F_TWI_Write(AT91C_BASE_TWI, 0x0, (char *)&write, 2);
	
	// Wait 10 ms before data is written into EEPROM
	for (loop=0; loop<100000; loop++);
	
	AT91F_TWI_Read(AT91C_BASE_TWI, 0x0, (char *)&read, 2);

	// Wait 10 ms before data is written into EEPROM
	if (read == write){
		AT91F_DBGU_Printk("-I- Test OK\n\r");
	} else {
		AT91F_DBGU_Printk("-E- Error during test\n\r");
	}
}

⌨️ 快捷键说明

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