ads1110数据转换
用dsp28335采集三路传感器数据,用三路ads1110进行AD转换,写入控制字为0x8C,在采集数据时,回采控制字时,0x8C中夹杂着0xC,这是为什么
亲;建议查下竞争。
能帮我详细的讲一下吗,万分感激,我的程序上都是等待上一路采集完才开始下一路的采集,I2C模块程序附在下面。
还有一个现象是:
采集出的数据顺序和技术手册上也不一样,
技术手册上:第三个字节是控制字,
我采集出的控制字是第二个字节。
#include "DSP2833x_Device.h" // Headerfile Include File
#include "DSP2833x_Examples.h" // Examples Include File
/*****************************IIC通信程序*******************************/
Uint16 HighDate=0;
Uint16 LowDate=0;
Uint16 ContDate=0;
struct I2cmsg *CurrentMsgPtr; // Used in interrupts
/*****************************IIC初始化*******************************/
void I2CA_Init(void)
{
//I2caRegs.I2CSAR = I2C_SLAVE_ADDR; // Slave address - EEPROM control code
#if (CPU_FRQ_150MHZ) // Default - For 150MHz SYSCLKOUT
I2caRegs.I2CPSC.all = 14; // Prescaler - need 7-12 Mhz on module clk (150/15 = 10MHz)
#endif
#if (CPU_FRQ_100MHZ) // For 100 MHz SYSCLKOUT
I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk (100/10 = 10MHz)
#endif
I2caRegs.I2CCLKL = 10; // NOTE: must be non zero
I2caRegs.I2CCLKH = 5; // NOTE: must be non zero
I2caRegs.I2CIER.all = 0x28; // Enable SCD & ARDY interrupts
I2caRegs.I2CMDR.all = 0x0020; // Take I2C out of reset
// Stop I2C when suspended
I2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFO
I2caRegs.I2CFFRX.all = 0x2060; // Enable RXFIFO, clear RXFFINT,
return;
}
Uint16 I2CA_WriteData(struct I2cmsg *msg)
{
Uint16 i;
// Wait until the STP bit is cleared from any previous master communication.
// Clearing of this bit by the module is delayed until after the SCD bit is
// set. If this bit is not checked prior to initiating a new message, the
// I2C could get confused.
if (I2caRegs.I2CMDR.bit.STP == 1)
{
return I2C_STP_NOT_READY_ERROR;
}
// Setup slave address
I2caRegs.I2CSAR = msg->SlaveAddress;
// Check if bus busy
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
// Setup number of bytes to send
// MsgBuffer
I2caRegs.I2CCNT = msg->NumOfBytes;
// Setup data to send
for (i=0; i<msg->NumOfBytes; i++)
{
I2caRegs.I2CDXR = *(msg->MsgBuffer+i);
}
// Send start as master transmitter
I2caRegs.I2CMDR.all = 0x6E20;
return I2C_SUCCESS;
}
Uint16 I2CA_ReadData(struct I2cmsg *msg)
{
if (I2caRegs.I2CMDR.bit.STP == 1)
{
return I2C_STP_NOT_READY_ERROR;
}
I2caRegs.I2CSAR = msg->SlaveAddress;
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
I2caRegs.I2CCNT = msg->NumOfBytes; // Setup how many bytes to expect
I2caRegs.I2CMDR.all = 0x2C20; // Send restart as master receiver
return I2C_SUCCESS;
}
interrupt void i2c_int1a_isr(void) // I2C-A
{
Uint16 IntSource, i;
IntSource = I2caRegs.I2CISRC.all;// Read interrupt source
// Interrupt source = stop condition detected
if(IntSource == I2C_SCD_ISRC)
{
// If completed message was writing data, reset msg to inactive state
if (CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_WRITE_BUSY)
{
CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_INACTIVE;
}
}
else if (I2caRegs.I2CFFTX.bit.TXFFINT == 1)
{
if (I2caRegs.I2CSTR.bit.NACK == 1)
{
I2caRegs.I2CMDR.bit.STP = 1;
I2caRegs.I2CSTR.all = I2C_CLR_NACK_BIT;
}
else if(CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP_BUSY)
{
for(i=0; i < CurrentMsgPtr->NumOfBytes; i++)
{
CurrentMsgPtr->MsgBuffer[i] = I2caRegs.I2CDRR;
}
LowDate=CurrentMsgPtr->MsgBuffer[0];
ContDate=CurrentMsgPtr->MsgBuffer[1];
HighDate=CurrentMsgPtr->MsgBuffer[2];
CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_SEND_NOSTOP;
I2caRegs.I2CFFTX.bit.TXFFINT == 1;
}
}
else
{
// Generate some error due to invalid interrupt source
asm(" ESTOP0");
}
// Enable future I2C (PIE Group 8) interrupts
PieCtrlRegs.PIEACK.all = PIEACK_GROUP8;
}
///////////////////////////////////
///////////I2C 数据读取//////////////
///////////////////////////////////
int16 I2C_ADread(struct I2cmsg *msg)
{
int16 advalue=0;
// Check outgoing message status. Bypass read section if status is
// not inactive.
//while(I2cMsgIn2.MsgStatus == I2C_MSGSTAT_SEND_NOSTOP);
if(msg->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP)
{
// Check incoming message status.
// EEPROM address setup portion
while(I2CA_ReadData(msg) != I2C_SUCCESS)
{
}
// Update current message pointer and message status
CurrentMsgPtr = msg;
msg->MsgStatus = I2C_MSGSTAT_SEND_NOSTOP_BUSY;
}
while(msg->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP_BUSY);
advalue=(HighDate<<8)|LowDate;
return advalue;
}
///////////////////////////////////
///////////I2C 写控制字 ////////
///////////////////////////////////
void I2C_WriteCont(struct I2cmsg *msg)
{
Uint16 Error;
if(msg->MsgStatus == I2C_MSGSTAT_SEND_WITHSTOP)
{
Error = I2CA_WriteData(msg);
if (Error == I2C_SUCCESS)
{
CurrentMsgPtr = msg;
msg->MsgStatus = I2C_MSGSTAT_WRITE_BUSY;
}
while(msg->MsgStatus == I2C_MSGSTAT_WRITE_BUSY);
}
}