20151126-2:I2C分析
一:I2C模组的基本结构和基本函数
The restrictionson reading and clock stretching do not apply to xCORE-200 devices。
在工程的makefile中只列出了下面两个I2C模组:module_i2c_shared,module_i2c_single_port。
在module_i2c_single_port、module_i2c_simple、module_i2c_master中所有的接口函数都定义为同样名称的四个函数(同样的i2c中定义):
i2c_master_init(),i2c_master_rx(),
i2c_master_read_reg(),i2c_master_write_reg()
其中module_i2c_shared为母类。根据makefile中导入的模组名调用该模组下的对应函数,module_i2c_shared对应也有四个函数,我们在应用程序中调用这四个shared函数:
i2c_shared_master_init,i2c_shared_master_rx,
i2c_shared_master_read_reg,i2c_shared_master_write_reg
每一个函数的结构均如下例所示:
inti2c_shared_master_read_reg(REFERENCE_PARAM(struct r_i2c, i2cPorts), int device,int reg_addr, unsigned char data[], int nbytes)
{
int retval;
swlock_acquire(&i2c_swlock); //软加锁
retval = i2c_master_read_reg(device, reg_addr, data, nbytes, i2cPorts); //执行操作
swlock_release(&i2c_swlock); //解锁
return retval;
}
注意:(20151221添加)这里的I2C地址为实际的写地址右移一位,比如写地址为0x98,则函数中的I2C地址为0x98/2=0x4C.(原始地址中的最低位始终是读写区分位)
二:I2C重要参数和函数说明
1、i2c端口速率定义
/** This constant defines the time in clockticks between successive bits. By default set to 1000 for 100 Kbit devices, butit can be overridden to 250 for 400 Kbit devices. */
\#define I2C_BIT_TIME 1000
2、i2c端口说明:
struct r_i2c {
port scl; /**< Port onwhich clock wire is attached. Must be on bit 0 */
port sda; /**< Port onwhich data wire is attached. Must be on bit 0 */
};
3、i2c_shared_master_rx函数没有被调用。
4、在audiohw.xc中定义了各种宏,用于对各种i2c设备进行读写操作。
三:AudioHwInit()、AudioHwConfig()
AudioHwInit()、AudioHwConfig()这两个函数中只有管脚设置和i2c寄存器设置。
AudioHwInit()的调用关系:
main()->usb_audio_io()作为一个Par->audio()->AudioHwInit() 在while(1)循环前。
AudioHwConfig()的调用关系:根据采样率的变化重新设置。
main()->usb_audio_io()作为一个Par->audio()->AudioHwConfig()在while(1)循环里。