Vấn đề về SPI với 595

MMKC

Thành Viên PIF
Tình hình mình code thử giao tiếp 595 với Lm4f nhưng kết quả không ra đúng theo ý mình
595 mình nối như sau:
Chân 13: OE nối đất
Chân 10: SRCLK nối VCC
Chân 14: Data nối với PẠ
Chân 12: Chân chốt nối với PD0
Chân 11: Clock nối với PA2

đây là code:
Code:
#define PART_LM4F120H5QR
 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/ssi.h"
#include <stdbool.h>
#include <stdint.h>
 
void main(void) {
SysCtlClockSet(
SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ
| SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0);
//GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_5);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_5);
 
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 7000000, 8);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
SSIEnable(SSI0_BASE);
uint16_t spidata;
spidata = 0;
while (1) {
 
 
SSIDataPut(SSI0_BASE, spidata);
 
while (SSIBusy(SSI0_BASE)) {
}
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
//SysCtlDelay(SysCtlClockGet() / 10000);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 1);
SysCtlDelay(SysCtlClockGet());
}
 
}
i
 

hung303mc

Thành Viên PIF
Bạn dùng TM4c123.... thì nên PART TM4C123...., do bạn đang sử dụng thư viện Tiva-ware. Nếu bạn dùng thư viện Stellarisware thì bạn mới PART_LM4F120H5QR.
 

honghiep

Cố Vấn CLB
Staff member
Tình hình mình code thử giao tiếp 595 với Lm4f nhưng kết quả không ra đúng theo ý mình
595 mình nối như sau:
Chân 13: OE nối đất
Chân 10: SRCLK nối VCC
Chân 14: Data nối với PẠ
Chân 12: Chân chốt nối với PD0
Chân 11: Clock nối với PA2

đây là code:
Code:
#define PART_LM4F120H5QR
 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/ssi.h"
#include <stdbool.h>
#include <stdint.h>
 
void main(void) {
SysCtlClockSet(
SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ
| SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0);
//GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_5);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_5);
 
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 7000000, 8);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
SSIEnable(SSI0_BASE);
uint16_t spidata;
spidata = 0;
while (1) {
 
 
SSIDataPut(SSI0_BASE, spidata);
 
while (SSIBusy(SSI0_BASE)) {
}
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
//SysCtlDelay(SysCtlClockGet() / 10000);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 1);
SysCtlDelay(SysCtlClockGet());
}
 
}
i
chương trình không có hiện tượng hay data bị sai vậy bạn?
 

MMKC

Thành Viên PIF
Đèn sáng hết luôn bạn.
Nghĩa là ra mức 0x00 hết
 

MMKC

Thành Viên PIF
spidata = 0;
SSIDataPut(SSI0_BASE, spidata);
ra 0x00 là đúng mà bạn?
ý mình là lúc nào cũng ra 0x00 với các loại giá trị.
Tư nhiên trưa nay trời mát mẻ nên con chip hoạt động đúng @_@.cũng chả hiểu bị sao nữa
Dù sao cũng thanks bạn :D
 

MMKC

Thành Viên PIF
Chi mình hỏi; mình đọc tới đây hơi thắc mắc là: ulBitRate
The ulBitRate parameter defines the bit rate for the SSI. This bit rate must satisfy the following
clock ratio criteria:
FSSI >= 2 ∗ bit rate (master mode); this speed cannot exceed 25 MHz.
FSSI >= 12 ∗ bit rate or 6 ∗ bit rate (slave modes), depending on the capability of the
specific microcontroller
where FSSI is the frequency of the clock supplied to the SSI module.
Mình cho ulBitRate =7000000 tức là 14mbit/s phải không. Nhưng chạy lại không đúng thấy đèn lúc nào cũng sáng cả
sysctlclockset tới 80mhz còn clockssi mình set là 80/4=20mhz
Code:
#define PART_LM4F120H5QR
 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/ssi.h"
#include <stdbool.h>
#include <stdint.h>
 
void main(void) {
unsigned int i = 0;
SysCtlClockSet(
SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ
| SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0);
//GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_5);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_5);
 
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet() / 4, SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 7000000, 8);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
SSIEnable(SSI0_BASE);
SSIEnable(SSI0_BASE);
 
while (1) {
SSIDataPut(SSI0_BASE, i);
 
while (SSIBusy(SSI0_BASE)) {
}
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
//SysCtlDelay(SysCtlClockGet() / 10000);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 1);
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0);
i++;
if (i == 255) {
i = 0;
}
SysCtlDelay(SysCtlClockGet() / 20);
}
 
}
 
Top