主题中讨论的其他器件:ADS1247、 ADS1248
工具/软件:Code Composer Studio
你(们)好
我 正在使用 SPI 通信将 cc3200与 ADS1247相连。问题是我无法获取数据。我在示波器中检查了 SCLK 引脚不工作、这意味着 clk 脉冲不会出现、而是作为一条直线出现。有时 SPIDataPutNonLocking funion 的返回函数也是如此 1在其他时候、它会提供0.Plz 帮助我解决问题。下面我附上了我的代码。
#include
#include "stdbool.h"
#include "stdint.h"
// Driverlib 包括
#include "hw_types.h"
#include "hw_memmap.h"
#include "hw_common_reg.h"
#include "hw_ints.h"
#include "spi.h"
#include "rom.h"
#include "rom_map.h"
#include "utils.h"
#include "prcm.h"
#include "UART.h"
#include "interrupt.h"
#include "gpio.h"
#include "pin.h"
//通用接口包括
#include "UART_IF.h"
#include "IBP.h"
#define SPI_IF_bit_rate 1000000
void spiInit();
void IbpInit();
void IBP_initialize();
void send_data (unsigned char);
void rec_data();
//void receive_data1 (int);
//bool IBP_self_test ();
void main()
{
unsigned char ulUserData[4]="kll";
unsigned char data4;
unsigned long pui32DataRx[2];
int i=0;
ClearTerm();
InitTerm();
MAP_PRCMPeripheralReset (PRCM_GSPI);
PinMuxConfig();
spiInit();
IbpInit();
// IBP_self_test();
消息("\t\t********* 主要***** \n\n");
MAP_UARTCharPut (UARTA0_BASE、'c');
for (i=0;i<5;i++)
{
MAP_UARTCharPut (UARTA0_BASE、ulUserData[i]);
}
消息("\t\t********* IBP 数据***** \n\n");
SEND_DATA (ADS1248_CMD_ID);
SEND_DATA (ADS1248_CMD_WAKEUP);
Receive_data (2);
Data4= SPIDataGetNonBlocking (GSPI_base、&(pui32DataRx[0]));
报告("%x\n"、pui32DataRx[0]);
报告("%x\n"、&pui32DataRx[0]);
报告("%x\n"data4);
MAP_SPICSDisable (GSPI_BASE);
while (1)
{
//消息("\t\t***** IBP 数据***** \n\n");
//receive_data1 (1);
}
}
空 IbpInit()
{
// PK2 =电源控制
MAP_PRCMPeripheralClkEnable (PRCM_GPIOA1、PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO (PIN_03、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA1_base、0x10、GPIO_DIR_MODE_OUT);
//PK4 =接地控制
MAP_PinTypeGPIO (PIN_04、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA1_base、0x20、GPIO_DIR_MODE_OUT);
// PN0 = SPI_EN
MAP_PRCMPeripheralClkEnable (PRCM_GPIOA0、PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO (PIN_60、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x20、GPIO_DIR_MODE_OUT);
// PN1 = MUX_EN
MAP_PinTypeGPIO (PIN_61、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x40、GPIO_DIR_MODE_OUT);
// PN2 MUX_SELA
MAP_PinTypeGPIO (PIN_62、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x80、GPIO_DIR_MODE_OUT);
// PN3 MUX_sELB
MAP_PinTypeGPIO (PIN_15、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA2_base、0x6、GPIO_DIR_MODE_OUT);
GPIOPinWrite (GPIOA1_base、GPIO_PIN_4、GPIO_PIN_4);//PK2=1
GPIOPinWrite (GPIOA1_base、GPIO_PIN_5、0);//PK4=1
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_5、GPIO_PIN_5);//PN0=1
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_6、GPIO_PIN_6);//PN1=1
GPIOPinWrite (GPIOA0_BASE、GPIO_PIN_7、0);//PN2=0 //多路复用器 SEP-A
GPIOPinWrite (GPIOA2_base、GPIO_PIN_6、0);//PN3=1 //多路复用器 SEP-b
/* MAP_PRCMPeripheralClkEnable (PRCM_GPIOA2、PRCM_RUN_MODE_CLK);
MAP_PinTypeGPIO (PIN_08、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA2_base、0x2、GPIO_DIR_MODE_OUT);
GPIOPinWrite (GPIOA2_base、GPIO_PIN_1、0);*/
MAP_UtilsDelay (100000);//1ms
IBP_Initialize();//在 IBP.c 中
消息("\t\t***** IBPINIT ********* \n\n");
}
void spiInit()
{
MAP_PRCMPeripheralClkEnable (PRCM_GSPI、PRCM_RUN_MODE_CLK);
//为 SPI0 GSPI_CLK 配置 PIN_05
//
MAP_PinTypeSPI (PIN_05、PIN_MODE_7);
//
//为 SPI0 GSPI_MISO 配置 PIN_06
//
MAP_PinTypeSPI (PIN_06、PIN_MODE_7);
//
//为 SPI0 GSPI_MOSI 配置 PIN_07
//
MAP_PinTypeSPI (PIN_07、PIN_MODE_7);
//
//为 SPI0 GSPI_CS 配置 PIN_08
//
MAP_PinTypeSPI (PIN_08、PIN_MODE_7);
SPIReset (GSPI_base);
//配置 SPI 接口
//
MAP_SPIConfigSetExpClk (GSPI_base、MAP_PRCMPeripheralClockGet (PRCM_GSPI)、
SPI_IF_bit_rate、SPI_MODE_MASTER、SPI_SUB_MODE_1、
(SPI_SW_CTRL_CS |
SPI_4PIN_MODE |
SPI_Turbo_off |
SPI_CS_ACTIVEHIGH |
SPI_WL_8));
消息("\t\t********* SPIINIT***** \n\n");
//启用 SPI 进行通信
//
MAP_SPIEnable (GSPI_BASE);
MAP_SPICSEnable (GSPI_BASE);
}
/*********
*函数:IBP_Initialize()
*
*说明:此函数在调度函数和之前从 Main.c 中调用
*进行自检。 这在初始化 IBP 板(复用、速度等)后调用
*这用于初始化 IBP 板操作所需的 ADC 寄存器
并执行内部 ADC 校准。
*
*参数:空
*
*返回:null
*
*可重入性:否
*
*执行要求/假设:空
*
(小部分 /
void IBP_Initialize()
{
unsigned long pui32DataRx[NUM_SSI_DATA];
while (SPIDataGetNonBlocking (GSPI_base、&pui32DataRx[0]))
{
}
//SysCtlDelay (650000);//= 17ms。
//SysCtlDelay (50000);
MAP_UtilsDelay (650000);
MAP_UtilsDelay (50000);
SEND_DATA (ADS1248_CMD_RESET);
//SysCtlDelay (50000);
MAP_UtilsDelay (50000);
消息("\t\t********* IBP A***** \n\n");
SEND_DATA (ADS1248_CMD_SDATAC);
SEND_DATA (ADS1248_CMD_SELFOCAL);
Receive_data (1);
//SysCtlDelay (6500000);//17ms
MAP_UtilsDelay (6500000);
SEND_DATA (ADS1248_CMD_WREG);//40h
SEND_DATA (ADS1248_3_SYS0);//03h
SEND_DATA (ADS1248_1_VBIAS);//01h
SEND_DATA (ADS1248_0_MUX0);//00h
SEND_DATA (ADS1248_2_MUX1);//03h
//SEND_DATA (ADS1248_14_GAIN);//42h ADS1248_14_SPS
SEND_DATA (ADS1248_15_SPS);//从5sps (以上)到1000sps 进行设置。 当前设置为160 (或某值) SPS。
Receive_data (8);
SEND_DATA (ADS1248_CMD_RREG);//20h
SEND_DATA (ADS1248_3_SYS0);//03h
Receive_data (2);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_SYSGCAL);
Receive_data (1);
//SysCtlDelay (6500000);//17ms
MAP_UtilsDelay (650000);
//14 ---- 使用 WREG 命令(40h、03h、01h、00h、03h 和42h)写入相应的寄存器配置; --37页数据表
SEND_DATA (ADS1248_CMD_WREG);//40h
SEND_DATA (ADS1248_3_SYS0);//03h
SEND_DATA (ADS1248_1_VBIAS);//01h
SEND_DATA (ADS1248_0_MUX0);//00h
SEND_DATA (ADS1248_0_MUX0);//03h
SEND_DATA (ADS1248_15_SPS);//42h
Receive_data (6);
SEND_DATA (ADS1248_CMD_RREG);//20h
SEND_DATA (ADS1248_3_SYS0);
Receive_data (2);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_NOP);
Receive_data (1);
SEND_DATA (ADS1248_CMD_SYNC);//05h
SEND_DATA (ADS1248_CMD_SYNC);//05h--- ////因为我们必须提供两次 SYNC 命令--pg 38
Receive_data (2);
//SysCtlDelay (650000);
MAP_UtilsDelay (650000);
消息("\t\t********* 上次 IBP 初始化***** \n\n");
}
void send_data (无符号字符字节)
{
unsigned char 数据;
DATA=SPIDataPutNonBlocking (GSPI_base、Byte);
报告("\t\t\Tsend data=%d\n", data);
}
void receive_data (int n)
{
unsigned long rec=0;
unsigned char data=0;
DATA=SPIDataGetNonBlocking (GSPI_base、&rec);
报告("\t\trec1=%d\n\r\n"、rec);
报告("\t\t\t rec=%d\n", data);
}