主题中讨论的其他器件: ADS1243
你(们)好
我使用自己的 TM4C1294NCPDT 板并 将 Micro SD 卡、闪存 MX66L51235FZ2I 和 ADS1243连接 到 SSI3端口。
我将 SD 卡使用从器件选择引脚 PE1、 闪存使用 PQ1、 ADS1243使用 PK4。
与 SD 卡 闪存通信时获取时钟、但不与 ADS1243通信。
此外、还测试了 SD 卡读取 操作和闪存读取和写入操作、它们工作正常。
在与 ADS1243通信时、无法在特定引脚上通信或生成时钟和 Tx 信号。
在这里、我要附加代码来读取 ADC 计数。 我使用 SSI0并使用相同的初始化和读取过程完成了与 LM3S9B96的 ADC 通信。
任何人都能帮助解决这个问题
///------------------------------ 初始化 ADC -------------------------------------------------------
uint32_t a_SSIRecByte[4];
uint32_t a_SSISendByte[4];
unsigned long uiCount;
空 init_adc()
{
ROM_GPIOPinWrite (GPIO_PORTK_base、ADS1243、ADS1243_enable);
DELAY_ms (5);
A_SSISendByte[0]= 0xFE;
ADC_SSI_WRITE (A_SSISendByte、1);
延迟(10);
A_SSISendByte[0]= 0xFC;
ADC_SSI_WRITE (A_SSISendByte、1);
延迟(10);
A_SSISendByte[0]= 0x50;
A_SSISendByte[1]= 0x00;
A_SSISendByte[2]= 0x00;
ADC_SSI_WRITE (A_SSISendByte、3);
延迟(10);
A_SSISendByte[0]= 0x52;
A_SSISendByte[1]= 0x00;
A_SSISendByte[2]= 0xC2;
ADC_SSI_WRITE (A_SSISendByte、3);
延迟(10);
A_SSISendByte[0]= 0xF0;
ADC_SSI_WRITE (A_SSISendByte、1);
延迟(10);
delay_ms (250);
延迟(2);
A_SSISendByte[0]= 0x51;
A_SSISendByte[1]= 0x00;
A_SSISendByte[2]= 0x05;
ADC_SSI_WRITE (A_SSISendByte、3);
DELAY_ms (5);
ROM_GPIOPinWrite (GPIO_PORTK_base、ADS1243、ADS1243_disable);
}
///------------------------------ 读取 ADC -------------------------------------------------------
unsigned int read_adc (unsigned char ucChannelNo)
{
unsigned long ulRead;
ROM_GPIOPinWrite (GPIO_PORTK_base、ADS1243、ADS1243_enable);
DELAY_ms (5);
操作
{
ulRead = ROM_GPIOPinRead (GPIO_PORTK_base、ADS1243_DRDY);
}while (ulRead!= 0x00000000);
A_SSISendByte[0]= 0x51;
A_SSISendByte[1]= 0x00;
A_SSISendByte[2]= ucChannelNo;
ADC_SSI_WRITE (A_SSISendByte、3);
延迟(10);
A_SSISendByte[0]= 0x01;
ADC_SSI_WRITE (A_SSISendByte、1);
ADC_SSI_Read (A_SSIRecByte、3);
uiCount = 0;
uiCount = A_SSIRecByte[0]* 256;
uiCount = uiCount + A_SSIRecByte[1];
DELAY_ms (5);
ROM_GPIOPinWrite (GPIO_PORTK_base、ADS1243、ADS1243_disable);
return (uiCount);
}
///------------------------------ 写入数据 SSI -----------------
void ADC_SSI_write (uint32_t *ucData、unsigned short usLen)
{
无符号超长整型 ulLoop = 0;;
uint32_t uldmummy;
SSIAdvModeSet (SSI3_base、SSI_ADV_MODE_WRITE);
SSIAdvFrameHoldEnable (SSI3_base);
if (usLen == 3)
{
SSIDataPut (SSI3_base、ucData[ulLoop);
SSIDataGet (SSI3_base、ulDummy);
ulLoop ++;
SSIDataPut (SSI3_base、ucData[ulLoop);
SSIDataGet (SSI3_base、ulDummy);
ulLoop ++;
SSIAdvDataPutFrameEnd (SSI3_base、ucData[ulLoop);
SSIDataGet (SSI3_base、ulDummy);
}
其他
{
SSIAdvDataPutFrameEnd (SSI3_base、ucData[ulLoop);
SSIDataGet (SSI3_base、ulDummy);
}
}
///------------------------------ 读取数据 SSI -------------------------------------------------------
void adc_sso_read (uint32_t *ucData、unsigned long ulLen)
{
uint32_t ulData;
无符号超长整型 ulLoop = 0;
SSIAdvModeSet (SSI3_base、SSI_ADV_MODE_READ_WRITE);
SSIDataPut (SSI3_base、0x00);
SSIDataGet (SSI3_base、&ulData);
ucData[ulLoop =(ulData);
ulLoop ++;
SSIDataPut (SSI3_base、0x00);
SSIDataGet (SSI3_base、&ulData);
ucData[ulLoop =(ulData);
ulLoop ++;
SSIAdvDataPutFrameEnd (SSI3_base、0x00);
SSIDataGet (SSI3_base、&ulData);
ucData[ulLoop =(ulData);
}
///------------------------------ 初始化 SSI-----------------
extern unsigned char a_asci[10];
uint8_t g_ui8InstrReadID[]={0x90、0x00、0x00、0x00};
uint32_t pui32DataTx[NUM_SSI_DATA];
uint32_t pui32DataRx[NUM_SSI_DATA];
uint32_t ui32DeviceID;
空 SSI_FLASH_init (uint32_t ui32SysClock)
{
SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);
//
//为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI3、
//系统时钟电源,空闲时钟低电平和低电平有效时钟输入
//飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。
//对于 SPI 模式,可以设置 SSI 时钟的极性
//单元空闲。 您还可以配置所需的时钟边沿
//在上捕获数据。 有关的更多信息、请参阅数据表
//不同的 SPI 模式。
//
SSIConfigSetExpClk (SSI3_base、ui32SysClock、SSI_FRF_MOTO_MOTO_MODE_0、
SSI_MODE_MASTER、1000000、8);
//
//启用 SSI3模块。
//
SSIAdvModeSet (SSI3_base、SSI_ADV_MODE_WRITE);
SSIAdvFrameHoldEnable (SSI3_base);
SSIEnable (SSI3_base);
//
//首先读取设备 ID
//
ROM_GPIOPinWrite (GPIO_PORTQ_BASE、FLASH、FLASH_ENABLE);
ui32DeviceID = SSILibSendReadIDAdvMode (SSI3_base);
if (ui32DeviceID!= 0xC219) UARTSend ("无外部闪存\n"COM0);
否则 UARTSend ("检测到外部闪存\n"、COM0);
ROM_GPIOPinWrite (GPIO_PORTQ_BASE、FLASH、FLASH_DISABLE);
}
///------------------------------ 测试闪存-------------------------------------------------------
void test_flash()
{
unsigned char i、ucCount;
uint32_t pui32dmumy[1];
uint32_t ui32Index;
//
//永久循环,处理屏幕动画。 所有其他工作都是
//在中断处理程序中完成。
//
//
//从 SSI 端口读取任何残留数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
//
while (SSIDataGetNonBlocking (SSI3_base、&pui32dmumy[0]))
{
}
//
//初始化发送缓冲区
//
ucCount = 1;
for (ui32Index=0;ui32Indexx <NUM_SSI_DATA;ui32Index++)
{
pui32DataTx[ui32Index]= ucCount;
pui32DataRx[ui32Index]= 0x0;
ucCount++;
}
UARTSend ("正在开始读取操作...\n"COM4);
SSILibSendReadDataAdvBi (SSI3_base、0x0、INS_READ_DATA);
for (ui32Index=0;ui32Indexx <NUM_SSI_DATA-1;ui32Index++)
{
SSIDataPut (SSI3_base、dummy_byte);
SSIDataGet (SSI3_base、&pui32DataRx[ui32Index]);
}
SSIAdvDataPutFrameEnd (SSI3_base、dummy_byte);
SSIDataGet (SSI3_base、&pui32DataRx[NUM_SSI_DATA-1]);
UARTSend ("读取已完成...\n"COM4);
//
//显示数据
//
for (ui32Index=0;ui32Indexx <NUM_SSI_DATA;ui32Index++)
{
十进制到 ASCII (pui32DataRx[ui32Index]、3);
for (i=0;i<3;i++)
{
UARTCharPut (UART0_BASE、A_ASCII[i]);
}
UARTCharPut (UART0_BASE、10);
UARTCharPut (UART0_BASE、13);
}
}
///---------------------- 引脚配置---
void init_pinconfig()
{
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
// GPIO_PORta_AHB_DIR_= 0xC8;//端口 A
// GPIO_PORta_AHB_DEN_R |= 0xFC;
/*
GPIO_PORTB_AHB_DIR_= 0x34;//端口 B
GPIO_PORTB_AHB_DEN_R |= 0x37;
GPIO_PORTC_AHB_DIR_R |= 0x30;//端口 C
GPIO_PORTC_AHB_DEN_R |= 0x30;
GPIO_PORTD_AHB_DIR_R |= 0x60;//端口 D
GPIO_PORTD_AHB_DEN_R |= 0xFF;
GPIO_Porte AHB_DIR_R |= 0x3C;//端口 E
GPIO_Porte AHB_DEN_R |= 0x3D;
GPIO_PORTF_AHB_DIR_= 0x0C;//端口 F
GPIO_PORTF_AHB_DEN_R |= 0x0D;
GPIO_PORTG_AHB_DIR_R |= 0x01;//端口 G
GPIO_PORTG_AHB_DEN_R |= 0x03;
GPIO_Porth_AHB_DIR_= 0x00;//端口 H
GPIO_Porth_AHB_DEN_R |= 0x0F;
GPIO_PORTJ_AHB_DIR_|= 0x02;//端口 J
GPIO_PORTJ_AHB_DEN_R |= 0x03;
GPIO_PORTK_DIR_R |= 0x9F;//端口 K
GPIO_PORTK_DEN_R |= 0xFF;
GPIO_PORTL_DIR_R |= 0x00;//端口 L
GPIO_PORTL_DEN_R |= 0xC0;
GPIO_PORTM_DIR_R = 0xFF;//端口 M
GPIO_PORTM_DEN_R = 0xFF;
GPIO_PORTN_DIR_R |= 0x3D;//端口 N
GPIO_PORTN_DEN_R |= 0x3F;
GPIO_PORTP_DIR_R |= 0x04;//端口 P
GPIO_PORTP_DEN_R |= 0x04;
*
// GPIO_PORTQ_DIR_|= 0x17;//端口 Q
// GPIO_PORTQ_DEN_R |= 0x1F;
/*
ROM_GPIOPinTypeGPIOInput (GPIO_PORTQ_BASE、GPIO_PIN_3);// DIN 1.
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTQ_BASE、GPIO_PIN_4);// Wifi 电源启用
ROM_GPIOPinWrite (GPIO_PORTQ_BASE、GPIO_PIN_4、GPIO_PIN_4);// Wifi 电源启用
delay_ms (1);
ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPS、GPS_ON);//GPS 电源启用
ROM_GPIOPinWrite (GPIO_PORTN_BASE、SDI12、SDI12_DISABLE);
*
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTK_base、GPIO_PIN_7);
ROM_GPIOPinWrite (GPIO_PORTK_base、ADC_PWR、ADC_ON);// ADC 电源使能
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTK_base、GPIO_PIN_4);
ROM_GPIOPinWrite (GPIO_PORTK_base、ADS1243、ADS1243_disable);// ADS1243禁用
ROM_GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_5);// DRDY
/*
ROM_GPIOPinWrite (GPIO_PORTQ_BASE、wifi、WIFI_ON);// Wifi 模块电源启用
ROM_GPIOPinWrite (GPIO_PORTB_BASE、ICDI、ICDI_ON);// ICDI 电源启用
ROM_GPIOPinWrite (GPIO_Porta_base、LCD、LCD_ON);// LCD 模块启用
ROM_GPIOPinWrite (GPIO_PORTP_BASE、RS485、RS485_ON);// 5V 电源使能
ROM_GPIOPinWrite (GPIO_PORTN_BASE、RS485、RS485_RX_ENABLE);// RS485 RX 启用
*
ROM_GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_5);
ROM_GPIOPinWrite (GPIO_Porte _BASE、FLASH_PWR、FLASH_ON);//启用闪存电源
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTQ_BASE、GPIO_PIN_1);// SSI3-CEMX66L51235F
ROM_GPIOPinWrite (GPIO_PORTQ_BASE、FLASH、FLASH_DISABLE);// MX66禁用
ROM_GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_1);// SD 卡 CE
ROM_GPIOPinWrite (GPIO_Porte _BASE、SD_CARD、SD_CARD_DISABLE);// SD 卡 CE
ROM_GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_4);//
ROM_GPIOPinWrite (GPIO_Porte _BASE、LED、LED_OFF);//用户 LED
/*
*// USB
HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTD_BASE + GPIO_O_CR)= 0xff;
ROM_GPIOPinConfigure (GPIO_PD6_USB0EPEN);
ROM_GPIOPinConfigure (GPIO_PD7_USB0PFLT);
ROM_GPIOPinTypeUSBAnalog (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
ROM_GPIOPinTypeUSBDigital (GPIO_PORTD_BASE、GPIO_PIN_6 | GPIO_PIN_7);
ROM_GPIOPinTypeUSBAnalog (GPIO_PORTL_BASE、GPIO_PIN_6 | GPIO_PIN_7);
*
//闪存和 SD 卡
HWREG (GPIO_PORTF_BASE_GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTF_BASE_GPIO_O_CR)|= GPIO_PIN_0;
ROM_GPIOPinConfigure (GPIO_PQ0_SSI3CLK);
ROM_GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
ROM_GPIOPinConfigure (GPIO_PF0_SSI3XDAT1);
ROM_GPIOPinTypeSSI (GPIO_PORTF_BASE、GPIO_PIN_0);
ROM_GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 | GPIO_PIN_2);
}
///------------------ 主函数-------------------------------------------------------
int main (空)
{
INT nStatus;
FRESULT iFResult;
INT 结果;
//
//从 PLL 以120MHz 运行。
//
G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
//
//配置器件引脚。
//
init_pinconfig();
delay_ms (10);
uart0_init (g_ui32SysClock);
delay_ms (100);
if ((CH1.Averaging <= 0)||(CH1.Averaging >50)) CH1.Averaging = 5;
if (((ch2.averating<= 0)||(ch2.averating>50)) ch2.averating=5;
if (((CH3.Averaging <= 0)||(CH3.Averaging >50)) CH3.Averaging = 5;
if (((Ch4.Averaging <= 0)||(Ch4.Averaging >50))) Ch4.Averaging = 5;
timer0_init (g_ui32SysClock);
/*
UARTSend ("mount\n",COM0);
iFResult = f_mount (0、&g_sFatfs);
if (iFResult!= FR_OK)
{
退货(1);
}
结果= Cmd_cat (argc1、argv1[1]);*/
///----------------------------------------------------------
UARTSend ("闪存初始化\n"COM0);
SSI_FLASH_init (g_ui32SysClock);
UARTSend ("闪存测试\n"COM0);
// test_flash1();
UARTSend ("ADC init\n"COM0);
init_adc();
UARTSend ("ADC Test\n"COM0);
/*
///------------------ USB 测试---
USB_init (g_ui32SysClock);
delay_ms (1);
///----------------------------------------------------------
*
while (1)
{
if (b 间隔)
{
b 间隔= 0;
ucChannelNo++;
if (ucChannelNo > 5) ucChannelNo = 1;
}
取平均值();
十进制转换为 ASCII (A_ADC[1]、5);
A_ASCII[5]= 0;
UARTSend (A_ascii、COM0);
UARTCharPut (UART0_BASE、');
十进制转换为 ASCII (A_ADC[2]、5);
A_ASCII[5]= 0;
UARTSend (A_ascii、COM0);
UARTCharPut (UART0_BASE、');
十进制转换为 ASCII (A_ADC[3]、5);
A_ASCII[5]= 0;
UARTSend (A_ascii、COM0);
UARTCharPut (UART0_BASE、');
十进制转换为 ASCII (A_ADC[4]、5);
A_ASCII[5]= 0;
UARTSend (A_ascii、COM0);
UARTCharPut (UART0_BASE、');
十进制转换为 ASCII (A_ADC[5]、5);
A_ASCII[5]= 0;
UARTSend (A_ascii、COM0);
UARTCharPut (UART0_BASE、'\n');
delay_ms (400);
}
}
//-------- 定时器0中断---
//第一个计时器中断的中断处理程序。
空 Timer0IntHandler (空)
{
//
//清除计时器中断。
//
ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
//
//更新显示屏上的中断状态。
//
ROM_IntMasterDisable();
if (ucToggle0)
{
GPIO_Porte AHB_DATA_R |= 0x10;
}
其他
{
GPIO_Porte AHB_DATA_R &=~Ω(0x10);
}
ucToggle0 =~Ω ucToggle0;
ucScrollCounter++;
if (ucScrollCounter >= 6)
{
ucScrollCounter = 0;
ucMessageCounter++;
b 间隔= 1;
// bDisplayOnce = 0;
if (ucMessageCounter > total_messages)
{
ucMessageCounter = 1;
// bOneCyclDelay = 1;
}
}
ROM_IntMasterEnable();
}