测试工程实例hsi2cTempSensor ,我现在想这个基础上修改下读出PCF85163的时间,我的操作是把configData修改成从机地址,I2C端口修改下。调试出现无应答的错误。是不是还需要修改一些其它的东西。
我用的平台是CCS5.2,用的是自己的平台,BSD是AM335X_StarterWare_02_00_00_07,谢谢大神的指教,刚接触,谢谢。
测试工程实例hsi2cTempSensor ,我现在想这个基础上修改下读出PCF85163的时间,我的操作是把configData修改成从机地址,I2C端口修改下。调试出现无应答的错误。是不是还需要修改一些其它的东西。
我用的平台是CCS5.2,用的是自己的平台,BSD是AM335X_StarterWare_02_00_00_07,谢谢大神的指教,刚接触,谢谢。
使用的是I2C2(D18 D17) 读取PCF8563时间 平台是CCS5.2,用的是自己的平台,BSD是AM335X_StarterWare_02_00_00_07
部分发代码如下:
main(){
IntMasterIRQEnable();
I2CAintcConfigure();
I2CPinMuxSetup(1);
I2CMasterDisable(SOC_I2C_2_REGS);
I2CAutoIdleDisable(SOC_I2C_2_REGS);
I2CMasterInitExpClk(SOC_I2C_2_REGS, 48000000, 12000000, 400000);
I2CMasterSlaveAddrSet(SOC_I2C_2_REGS, I2C_SLAVE_ADDR); //此处设置的从机地址是写(A3)
I2CMasterEnable(SOC_I2C_2_REGS);
configData = 0xA2
ConfigureTimeSensor(configData) //发送写
configData = 0x02
ConfigureTimeSensor(configData) //发送从机地址
configData = 0x02 | 0x01
ConfigureTimeSensor(configData) //发送读模式
configData = 0x02
TimeRegRead(time, configData); //读指令
}
static void ConfigureTempSensor(unsigned char configData){
dataToSlave[0] =configData;
tCount = 0;
SetupI2CTransmit(1);
}
在调试的过程中,每次发送数据就会停止在SetupI2CTransmit里面的while(flag)等待。一直执行不下去,是不是哪个地方设置有问题,还有就是对 SetupI2CTransmit函数理解错误了,求指导,谢谢了。
有时间可以给一个am335x 的I2C2的一个使用例程。我修改使用I2C2读取pcf8563时间(祼机跑),可是无法正常执行下去(修改时钟、管脚)。已经好几天了,还是没有解决问题。刚入手,谢谢。修改后的代码如下:
main(){
I2CAintcConfigure();
SetupI2C();
configData = 0xA2 ;
ConfigureTimeSensor(configData);
ptrReg = 0x02;
TemperatureRegRead(temperature, ptrReg);
}
static void SetupI2C(void)
{
// I2C1ModuleClkConfig(); // I2C2 clk module
I2C2ModuleClkConfig();
I2CPinMuxSetup(2);
/* Put i2c in reset/disabled state */
I2CMasterDisable(SOC_I2C_2_REGS);
/*
** Upon reset Auto Idel is enabled.
** Hence it is disabled after reset
*/
I2CAutoIdleDisable(SOC_I2C_2_REGS);
/* Configure i2c bus speed to 400khz */
I2CMasterInitExpClk(SOC_I2C_2_REGS, 48000000, 12000000, 400000);
/* Set i2c slave address */
I2CMasterSlaveAddrSet(SOC_I2C_2_REGS, I2C_SLAVE_ADDR); //0xA2
/* Bring I2C module out of reset */
I2CMasterEnable(SOC_I2C_2_REGS);
}
void I2CPinMuxSetup(unsigned int instance)
{
if(instance == 0)
{
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_I2C0_SDA) =
(CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_RXACTIVE |
CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_SLEWCTRL |
CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_PUTYPESEL );
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_I2C0_SCL) =
(CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_RXACTIVE |
CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_SLEWCTRL |
CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_PUTYPESEL );
}
else if(instance == 1)
{
/* I2C_SCLK */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D1) =
(CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_PUTYPESEL |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
/* I2C_SDA */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_CS0) =
(CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_PUTYPESEL |
CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
}
else if(instance == 2)
{
/* I2C_SCLK */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_RTSN(1)) =
(CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_PUTYPESEL |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
/* I2C_SDA */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_CTSN(1)) =
(CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_PUTYPESEL |
CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
}
}
/*
** I2C Interrupt Service Routine. This function will read and write
** data through I2C bus.
*/
void I2CIsr(void)
{
unsigned int status = 0;
/* Get only Enabled interrupt status */
status = I2CMasterIntStatus(SOC_I2C_2_REGS);
/*
** Clear all enabled interrupt status except receive ready and
** transmit ready interrupt status
*/
I2CMasterIntClearEx(SOC_I2C_2_REGS,
(status & ~(I2C_INT_RECV_READY | I2C_INT_TRANSMIT_READY)));
if(status & I2C_INT_RECV_READY)
{
/* Receive data from data receive register */
dataFromSlave[rCount++] = I2CMasterDataGet(SOC_I2C_2_REGS);
/* Clear receive ready interrupt status */
I2CMasterIntClearEx(SOC_I2C_2_REGS, I2C_INT_RECV_READY);
if(rCount == numOfBytes)
{
/* Disable the receive ready interrupt */
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_RECV_READY);
/* Generate a STOP */
I2CMasterStop(SOC_I2C_2_REGS);
}
}
if (status & I2C_INT_TRANSMIT_READY)
{
/* Put data to data transmit register of i2c */
I2CMasterDataPut(SOC_I2C_2_REGS, dataToSlave[tCount++]);
/* Clear Transmit interrupt status */
I2CMasterIntClearEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY);
if(tCount == numOfBytes)
{
/* Disable the transmit ready interrupt */
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY);
}
}
if (status & I2C_INT_STOP_CONDITION)
{
/* Disable transmit data ready and receive data read interupt */
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_RECV_READY |
I2C_INT_STOP_CONDITION);
flag = 0;
}
if(status & I2C_INT_NO_ACK)
{
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_RECV_READY |
I2C_INT_NO_ACK |
I2C_INT_STOP_CONDITION);
/* Generate a STOP */
I2CMasterStop(SOC_I2C_2_REGS);
flag = 0;
}
}
static void ConfigureTimeSensor(unsigned char configData)
{
dataToSlave[0] = configData;
tCount = 0;
SetupI2CTransmit(1);
}
/* Reads temperature value */
static void TemperatureRegRead(unsigned char *data, unsigned char ptrReg)
{
unsigned int i;
rCount = 0;
tCount = 0;
/* Reg offset of temperature sensor */
dataToSlave[0] = ptrReg;
SetupI2CReception(7);
for(i = 7; i ; i--)
{
*data = dataFromSlave[7-i];
data++;
}
}