TI中文支持网
TI专业的中文技术问题搜集分享网站

28335与AD7606的SPI通讯

最近一直弄28335通过SPI读取AD7606采集到的数据,但是采集到的一直不准确,不知是否应为读取的问题。AD7606有8个采集通道,通过SPI读取时输出的实际顺序应该为1,2,3,4,5,6,7,8,但是我的读出的结果顺序是7,8,1,2,3,4,5,6,输出的结果有些通道的不对,不知是否因为读出的时候相互影响的。我是通过修改的TI给出的spi FIFI回环测试的例程,把回环测试去掉,发送中断修改为普通的发送(因为我不需要发送,而SPI必须是发送的时候才能接收。),AD7606数据转换完成的时候开启发送,因为我要读取8个16位数据,所以之后发送8个数据。在接收中断里处理接收到的数据。

void AD7606_CfgSpiHard(void)//这是SPI配置
{
// Initialize SPI FIFO registers
SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI

SpiaRegs.SPICCR.all=0x000F; //16-bit character,NO Loopback mode
SpiaRegs.SPICTL.all=0x0017; //Interrupt enabled, Master/Slave XMIT enabled

SpiaRegs.SPISTS.all=0x0000;

SpiaRegs.SPIBRR=0x02; // Baud rate

SpiaRegs.SPIFFTX.all=0xC040;

SpiaRegs.SPIFFRX.all=0x0028; // Set RX FIFO level to 8
SpiaRegs.SPIFFCT.all=0x00;
SpiaRegs.SPIPRI.all=0x0010;

SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI

SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;

}

interrupt void xint_isr(void)//AD7606转换完成会产生一个外部中断,之后读取采集到的数据
{ while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}

SpiaRegs.SPICTL.bit.TALK=1;//启动发送
SpiaRegs.SPITXBUF=sdata; // Send data,因为我要接收8个数据,所以发送8次
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
PieCtrlRegs.PIEACK.bit.ACK1 = 1;

}
interrupt void SPI_receive_deal(void)//接收FIFO满的时候会产生一个中断
{ AD7606_Scan();//读出采集到的数据,并处理
SpiaRegs.SPICTL.bit.TALK=0;//禁止发送 PieCtrlRegs.PIEACK.bit.ACK6=1; SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;// Clear SPI Interrupt flag
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag
}

谢谢,实在是弄的头疼,不知道哪里出了问题

feng shi:

这个有人知道吗,根据自己的感觉随意说,也许您的不经意间的指导就解决问题了,谢谢

最近一直弄28335通过SPI读取AD7606采集到的数据,但是采集到的一直不准确,不知是否应为读取的问题。AD7606有8个采集通道,通过SPI读取时输出的实际顺序应该为1,2,3,4,5,6,7,8,但是我的读出的结果顺序是7,8,1,2,3,4,5,6,输出的结果有些通道的不对,不知是否因为读出的时候相互影响的。我是通过修改的TI给出的spi FIFI回环测试的例程,把回环测试去掉,发送中断修改为普通的发送(因为我不需要发送,而SPI必须是发送的时候才能接收。),AD7606数据转换完成的时候开启发送,因为我要读取8个16位数据,所以之后发送8个数据。在接收中断里处理接收到的数据。

void AD7606_CfgSpiHard(void)//这是SPI配置
{
// Initialize SPI FIFO registers
SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI

SpiaRegs.SPICCR.all=0x000F; //16-bit character,NO Loopback mode
SpiaRegs.SPICTL.all=0x0017; //Interrupt enabled, Master/Slave XMIT enabled

SpiaRegs.SPISTS.all=0x0000;

SpiaRegs.SPIBRR=0x02; // Baud rate

SpiaRegs.SPIFFTX.all=0xC040;

SpiaRegs.SPIFFRX.all=0x0028; // Set RX FIFO level to 8
SpiaRegs.SPIFFCT.all=0x00;
SpiaRegs.SPIPRI.all=0x0010;

SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI

SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;

}

interrupt void xint_isr(void)//AD7606转换完成会产生一个外部中断,之后读取采集到的数据
{ while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}

SpiaRegs.SPICTL.bit.TALK=1;//启动发送
SpiaRegs.SPITXBUF=sdata; // Send data,因为我要接收8个数据,所以发送8次
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
PieCtrlRegs.PIEACK.bit.ACK1 = 1;

}
interrupt void SPI_receive_deal(void)//接收FIFO满的时候会产生一个中断
{ AD7606_Scan();//读出采集到的数据,并处理
SpiaRegs.SPICTL.bit.TALK=0;//禁止发送 PieCtrlRegs.PIEACK.bit.ACK6=1; SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;// Clear SPI Interrupt flag
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag
}

谢谢,实在是弄的头疼,不知道哪里出了问题

feng shi:

回复 feng shi:

这个问题解决了,是因为波特率设置的太高了。但是发现测量直流时结果正确,但是测量用信号发生器发出的50HZ的正弦波的时候,电压最高只有2.6V左右,而实际的峰值电压是5V,暂不知原因。谁能说下,谢谢

最近一直弄28335通过SPI读取AD7606采集到的数据,但是采集到的一直不准确,不知是否应为读取的问题。AD7606有8个采集通道,通过SPI读取时输出的实际顺序应该为1,2,3,4,5,6,7,8,但是我的读出的结果顺序是7,8,1,2,3,4,5,6,输出的结果有些通道的不对,不知是否因为读出的时候相互影响的。我是通过修改的TI给出的spi FIFI回环测试的例程,把回环测试去掉,发送中断修改为普通的发送(因为我不需要发送,而SPI必须是发送的时候才能接收。),AD7606数据转换完成的时候开启发送,因为我要读取8个16位数据,所以之后发送8个数据。在接收中断里处理接收到的数据。

void AD7606_CfgSpiHard(void)//这是SPI配置
{
// Initialize SPI FIFO registers
SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI

SpiaRegs.SPICCR.all=0x000F; //16-bit character,NO Loopback mode
SpiaRegs.SPICTL.all=0x0017; //Interrupt enabled, Master/Slave XMIT enabled

SpiaRegs.SPISTS.all=0x0000;

SpiaRegs.SPIBRR=0x02; // Baud rate

SpiaRegs.SPIFFTX.all=0xC040;

SpiaRegs.SPIFFRX.all=0x0028; // Set RX FIFO level to 8
SpiaRegs.SPIFFCT.all=0x00;
SpiaRegs.SPIPRI.all=0x0010;

SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI

SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;

}

interrupt void xint_isr(void)//AD7606转换完成会产生一个外部中断,之后读取采集到的数据
{ while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}

SpiaRegs.SPICTL.bit.TALK=1;//启动发送
SpiaRegs.SPITXBUF=sdata; // Send data,因为我要接收8个数据,所以发送8次
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
SpiaRegs.SPITXBUF=sdata; // Send data
PieCtrlRegs.PIEACK.bit.ACK1 = 1;

}
interrupt void SPI_receive_deal(void)//接收FIFO满的时候会产生一个中断
{ AD7606_Scan();//读出采集到的数据,并处理
SpiaRegs.SPICTL.bit.TALK=0;//禁止发送 PieCtrlRegs.PIEACK.bit.ACK6=1; SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;// Clear SPI Interrupt flag
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag
}

谢谢,实在是弄的头疼,不知道哪里出了问题

feng shi:

回复 feng shi:

犯了一个低级错误,是波形发生的问题。现在测量的正常了。但是看datasheet说SPI串行读取的时候,波特率最高在11MHZ以上,但是我设的0.75MHZ就读取不正确了,0.375MHZ的可以(用的SPI,转换后读取)。28335的SPI达不到吗,可以的啊,不是最高说是37.5MHZ

赞(0)
未经允许不得转载:TI中文支持网 » 28335与AD7606的SPI通讯
分享到: 更多 (0)