主题中讨论的其他器件: ADS1118
您好!
我使用 MSP430F5529通过 SPI 与三个 ADS1118通信。 我无法读取 ADS1118的输出、因为其 SPI 协议与标准 SPI 协议稍有不同。 我的 MSP430代码(随附)仅读取 MSB、并且无法读取 LSB ADS1118输出代码。 请提供任何帮助。
我要连接 ADS1118的 SPI 协议。 MSP430 (主器件)正在向 ADS1118 (从器件)写入0x8F (MSB)和0xEB (LSB)。 我可以对 SPI 协议进行范围检查并确认这是正确的。
我还将附加我的 MSP430 SPI 代码。
Thanks.e2e.ti.com/.../ADS1118_5F00_SPI_5F00_MSP430FF529_5F00_Code.txt
//
//
//说明:SPI 主控(MSP430F5529)与3个 ADS1118从器
件通信//
MSP430F5529
// --------
// | (请参阅下面的)|->从器件芯片选择(GPIO)
// | |
// | |
// | |
// | P3.3|->数据输出(UCA0SIMO/DIN)
// | |
// | P3.4|<-数据输入(UCA0SOMI/DOUT)
// | |
// | P2.7|->串行时钟输出(UCA0CLK)
// | |
// | |///CSB_ADC1
= P1.2;CSB_ADC2 = P1.3;CSB_ADC3 = P1.4
//
////////*********
#include
#include
#include
#define dummy 0x00
#define CSB_M1_OUT P1OUT
#define CSB_M1_DIR P1DIR
#define CSB_M1_PIN BIT2
#define CSB_M2_OUT P1OUT
#define CSB_M2_DIR P1DIR
#define CSB_M2_PIN BIT3
#define CSB_M3_OUT P1OUT P1OUT #define CSB_M2_DIR #define CSB_P1DIR #define
P1DIR #define CSB_M2_P1DIR #define P1DIR #define BIT3
1
#define length_two 2
#define length_Six 6
#define MAX_BUFFER_SIZE 20
#define ADS1118_REG_ADDR_CONFIG_REG_MSB_def 0x8F //1000_1110
//8:MODE = 0用于连续转换模式;1 =断电模式
// 11:9:FSR =+/-0.256V
// 14:12:AIN0 =(+15 =
1)时 Ve = 111;单次转换=+/-0.256V // 14:12:Ux = 000用于 Ave (+15 = 1) 1 =启动单次转换
typedef 枚举 SPI_ModeEnum{
IDLE_MODE、
TX_REG_ADDRESS_MODE、
RX_REG_ADDRESS_MODE、
TX_DATA_MODE、
RX_DATA_MODE、
WRITE_READ_MODE、
timeout_mode
}SPI_Mode;
uint8_t ADS1118_REG_ADDR_CONFIG_REG_LSB[length_One]={0xEB};//1110_1010
// 0:保留
//2:1:NOOP = 01 (有效数据)
/3:上拉 EN =当/CSB 为高电平时、这将使
ADC 缓冲区上升到
6个引脚(dtruTS_8)(dr)= 1:t8:0[t_dsps (uTS_dr)
SPI_Mode MasterMode = IDLE_MODE;
uint8_t TransmitRegAddr = 0;
uint8_t TransmitDataMSB = 0;
uint8_t TransmitDataLSB = 0;
uint8_t ReceiveBuffer[MAX_buffer_SIZE]={0};
uint8_t TransmitBuffer = 0;uint8_t =
uint8_t
= uint8;uint8 = uintsensor_t Index = uint8;uint8 uint8 uint_t TransmitTransmittransaccum_t = 0;uint_t = uint_t
int mymode = 0;
uint8_t MyData = 0;
void SendUCA0Data (uint8_t val);
//*********
// CopyArray ********
//
void CopyArray (uint8_t *源、uint8_t *目的、uint8_t 计数);
void CopyArray (uint8_t *源、uint8_t *目的、 uint8_t count)
{
uint8_t copyIndex = 0;
for (copyIndex = 0;copyIndex < count;copyIndex++)
{
dest[copyIndex]= source[copyIndex];
}
}
//*********
//主设备写入从设备*********
//
SPI_Mode SPI_Master_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count、int senNum、int mode);
SPI_Mode SPI_Master_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count、int senNum、int mode)
{
sensor_number = senNum;
MasterMode = TX_REG_ADDRESS_MODE;
TransmitRegAddr = reg_addr;
//将寄存器数据复制到 TransmitBuffer
CopyArray (reg_data、TransmitBuffer、count);
TXByteCtr =计数;
RXByteCtr = 0;
ReceiveIndex = 0;
TransmitIndex = 0;
mymode =模式;
if (sensor_number = 6){
CSB_M1_OUT &=~(CSB_M1_PIN);
}
否则、如果(sensor_number = 7){
CSB_M2_OUT &=~(CSB_M2_PIN);
}
否则、如果(sensor_number = 8){
CSB_M3_OUT 和=~(CSB_M3_PIN);
}
SendUCA0Data (TransmitRegAddr);
_bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0
if (sensor_number = 6){
CSB_M1_OUT |= CSB_M1_PIN;
}
否则、如果(sensor_number = 7){
CSB_M2_OUT |= CSB_M2_PIN;
}
否则、如果(sensor_number = 8){
CSB_M3_OUT |= CSB_M3_PIN;
}
返回主模式;
}
//*********
//主从从从器件读取********
//
SPI_Mode SPI_Master_ReadReg (uint8_t reg_addr、uint8_t count、int senNum);
SPI_Mode SPI_Master_ReadReg (uint8_t reg_addr、uint8_t count、 int senNum)
{
sensor_number = senNum;
MasterMode = TX_REG_ADDRESS_MODE;
TransmitRegAddr = reg_addr;
RXByteCtr =计数;
TXByteCtr = 0;
ReceiveIndex = 0;
TransmitIndex = 0;
if (sensor_number = 6){
CSB_M1_OUT &=~(CSB_M1_PIN);
}
否则、如果(sensor_number = 7){
CSB_M2_OUT &=~(CSB_M2_PIN);
}
否则、如果(sensor_number = 8){
CSB_M3_OUT 和=~(CSB_M3_PIN);
}
_bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0
if (sensor_number = 6){
CSB_M1_OUT |= CSB_M1_PIN;
}
否则、如果(sensor_number = 7){
CSB_M2_OUT |= CSB_M2_PIN;
}
否则、如果(sensor_number = 8){
CSB_M3_OUT |= CSB_M3_PIN;
}
返回主模式;
}
//*********
//发送数据*********
//
void SendUCA0Data (uint8_t val)
{
while (!(UCA0IFG & UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
UCA0TXBUF = val;
}
//
//将时钟设置为16MHz*
//*********
void initClockTo16MHz()
{
UCSCTL3 |= SELREF_2; //设置 DCO FLL 基准= REFO
UCSCTL4 |= SE拉美 经济体系2; //设置 ACLK = REFO
_bis_SR_register (SCG0); //禁用 FLL 控制环路
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //选择 DCO 范围16MHz 操作
UCSCTL2 = FLLD_0 + 487; //将 DCO 乘法器设置为16MHz
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0); //启用 FLL 控制环路
// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 16 MHz/32、768Hz = 500000 = DCO 稳定的 MCLK 周期
_DELAY_CYCLES (50000);//
//循环直到 XT1、XT2和 DCO 故障标志被清除
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}
//*********
//初始化 GPIO
//*********
void initGPIO ()
{
//以下是 CSB 的 GPIO:
//CSB_A1 = P2.0;CSB_A2 = P2.2;CSB_A3 = P2.4;CSB_A4 = P2.5;CSB_A5 = P1.5
// CSB_M1 = P1.2;CSB_M2 = P1.3;CSB_M3 = P4DIR
= P7
~
;PIT7 + PIT7 | PIT7 = P4DIR = P7;BITR= P7 + P4DIR
// P3.3 = SIMO;P3.4 = SOMI
P2SEL |= BIT7; // P2.7 = SCLK
//UART
P4SEL |= BIT4 + BIT5; // P4.4 = UART TXD;P4.5 = UART RXD
/*
//用于启动传输
的按钮 P2DIR &=~BIT6; //将 P2.1设定为输入方向
P2REN |= BIT6; //启用 P2.1内部电阻
P2OUT |= BIT6; //将 P2.1设置为上拉电阻
P2IES |= BIT6; // P2.1高/低边沿
P2IFG &=~BIT6; // P2.1 IFG 清除
P2IE |= BIT6; // P2.1中断已启用
*/
}//
*********
//初始化 SPI
//*********
void initSPI (int sensorno)
{
UCA0CTL0 &= 0; //清除该寄存器
UCA0CTL1 |= UCSWRST; //**将状态机置于重置中**
UCA0CTL0 |= UCMSB + UCMST + UCSYNC;
/*UCCKPH =时钟相位选择= 0、根据 ADS1118 SPI 时序图
根据 ADS1118 SPI 时序图、UCCKPL =时钟极性选择= 0
UCMSB = MSB 优先
UCMST = MSP430F5528是主器件、MC3672和 ADS1118 =从器件
UCSYNC =同步*/
UCA0CTL1 |= UCSSEL_2; //时钟= SMCLK
UCA0BR0 |= 0x20; //比特率
UCA0BR1 = 0; //
UCA0MCTL = 0; //对于 SPI
UCA0CTL1 &=~UCSWRST、必须清除调制; //**初始化 USCI 状态机**
UCA0IE |= UCRXIE; //启用 USCI0 RX 中断
CSB_M1_DIR |= CSB_M1_PIN;
CSB_M1_OUT |= CSB_M1_PIN;
CSB_M2_DIR |= CSB_M2_PIN;
CSB_M2_OUT |= CSB_M2_PIN;
CSB_M3_DIR |= CSB_M3_PIN;
CSB_M3_OUT |= CSB_M3_PIN;
}
//*********
//主要内容
//发送和接收三条包含示例命令*******的消息
//
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
initClockTo16MHz();
initGPIO();
while (1)
{
initSPI (1);//初始化 ADS1118的 SPI
SPI_Master_WriteReg (ADS1118_REG_ADDR_CONFIG_REG_MSB_def、ADS1118_REG_ADDR_CONFIG_REG_LSB、length_one、6、1); //写入和读取 ADS1118
}//end while
}//end main
//*********
// SPI 中断
//
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_A1_vector))#USCI_A0
Compiler #a0_aid!
#endif
{
uint8_t uca0_Rx_val = 0;
switch (__evo_in_range (UCA0IV、4))
{
情况0:中断; //向量0 -无中断
案例2: //向量2 - RXIFG
UCA0_Rx_val = UCA0RXBUF;
开关(主模式)
{
//---Always starts with this --(始终从这开始--)
案例 TX_REG_ADDRESS_MODE:
IF (RXByteCtr) //如果从从器件读取主器件
{
MasterMode = RX_DATA_MODE;//需要立即开始接收
//发送虚拟到开始
_DELAY_CYCLES (75);
SendUCA0Data (虚拟);
}
否则(TXByteCtr) //如果主器件写入从器件
{
MasterMode = TX_DATA_MODE; //首先发送寄存器地址
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
}
中断;
案例 TX_DATA_MODE: //如果主器件写入从器件
IF (TXByteCtr) //发送数据
{
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
}
其他
{
如果(mymode=1){
UCA0_Rx_val = UCA0RXBUF;
ReceiveBuffer[0]= uca0_Rx_val;
UCA0_Rx_val = UCA0RXBUF;
ReceiveBuffer[1]= uca0_Rx_val;
UCA0_Rx_val = UCA0RXBUF;
ReceiveBuffer[2]= uca0_Rx_val;
}
//传输完成
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}
中断;
RX_DATA_MODE case: //如果从从器件读取主器件
IF (RXByteCtr)
{
ReceiveBuffer[ReceiveIndex++]= uca0_Rx_val;//从从器件读取数据
//发送虚拟
RXByteCtr --;
}
IF (RXByteCtr = 0)
{
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}
其他
{
SendUCA0Data (虚拟);
}
中断;
默认值:
__no_operation();
中断;
}
__DELAY_CYCLES (1);//100是主控方写入之间的~20us 间隔
中断;
案例4:中断; //向量4 - TXIFG
默认值:中断;
}
}

