主题中讨论的其他器件:ADS1247、 ADS1248
工具/软件:Code Composer Studio
您好!
我将 cc3200与 ads1247连接作为从设备。我在这里面临的问题是我无法从从从从设备获取数据。如果我使用 spidataput 和 spidataget、这些函数正常工作、这意味着它将在非从设备之后一直停留在该函数中 指令被执行。 而 SPIDataPutNonBlocking (GSPI_base、dat)的返回函数仅在第一次发送和剩余时间内获得1、而 SPIDataGetNonBlocking 函数的返回函数始终为零; 请在这方面帮助我
#include
#include "stdbool.h"
#include "stdint.h"
// Driverlib 包括
#include "rom.h"
#include "rom_map.h"
#include "hw_memmap.h"
#include "hw_common_reg.h"
#include "hw_types.h"
#include "hw_ints.h"
#include "UART.h"
#include "interrupt.h"
#include "pinmux.h"
#include "utils.h"
#include "prcm.h"
#include "pin.h"
#include "gpio.h"
#include "spi.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 receive_data (int);
//void receive_data1 (int);
bool IBP_self_test();
void main()
{
unsigned char ulUserData[4]="kll";
int i=0;
ClearTerm();
InitTerm();
spiInit();
IbpInit();
PinMuxConfig();
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");
while (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_50、PIN_MODE_0、false);
MAP_GPIODirModeSet (GPIOA0_BASE、0x1、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 (GPIOA0_BASE、GPIO_PIN_0、0);//PN3=1 //多路复用器 SEP-b
GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);*/// PD2=芯片选择=低电平有效
// GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0);//PD2=0 -根据数据表,步骤7
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);
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_SPIEnable (GSPI_BASE);
// map_SPICSEnable (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_3PIN_MODE |
SPI_Turbo_off |
// SPI_CS_ACTIVELOW|
SPI_WL_8));
消息("\t\t********* SPIINIT***** \n\n");
}
void IBP_Initialize()
{
unsigned long del=650000;
unsigned long Data0;
无符号长数据1;
unsigned long DataRx[NUM_SSI_DATA];
while (SPIDataGetNonBlocking (GSPI_base、&DataRx[0]))
{}
消息("\t\t********* IBPINITITALIZE***** \n\n");
MAP_UtilsDelay (DEL);
MAP_UtilsDelay (50000);
SEND_DATA (ADS1248_CMD_RESET);
MAP_UtilsDelay (50000);
消息("\t\t********* IBP A***** \n\n");
SEND_DATA (ADS1248_CMD_SDATAC);
SEND_DATA (ADS1248_CMD_SELFOCAL);
Receive_data (1);
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);
MAP_UtilsDelay (DEL);
//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);
MAP_UtilsDelay (DEL);
消息("\t\t********* 上次 IBP 初始化***** \n\n");
}
void send_data (unsigned char dat)
{
SPIDataPutNonBlocking (GSPI_base、dat);
消息("\t\t********* SENDDATA***** \n\n");
}
void receive_data (int n)
{
unsigned char ui32Index;
unsigned char 数据;
unsigned long pui32DataRx[10];
for (ui32Index = 0;ui32Index < n;ui32Index++)
{
//
//使用“阻塞”GET 函数接收数据。 此函数
//将等待接收 FIFO 中有数据后再返回。
//
DATA=SPIDataGetNonBlocking (GSPI_base、&pui32DataRx[ui32Index]);
//
//由于我们使用的是8位数据,所以屏蔽 MSB。
//
// pui32DataRx[ui32Index]&= 0x00FF;
报告("%x\n",data);
//
//显示 SSI0接收到的数据。
//
报告("%x\n"、pui32DataRx[ui32Index]);
}
消息("\t\t********* 接收数据***** \n\n");
}