Jump to content

    

LPC1768+DMA+SSP

> ну плохо вы справились и не с той проблемой...

 

У меня LPC1788 мастер, читает 46 байт из LPC1768 слейв.

LPC1768 читает два ЦАПа, обрабатывает данные, как только собирается 10 результатов, выдаёт импульс в порт на линию связи. LPC1788 при появлении на этой линии заднего фронта читает 46 байт.

 

Проблема была в том, что после резета мастер мог прочитать не все данные из слейва и в результате при последующих чтениях порядок байт был смещённым. Прична - оставшиеся в фифо слейва несчитанные мастером байты.

 

Код, который я привёл, вызывается в LPC1768 перед тем как выдать импульс готовности данных для LPC1788. Этот код великолепно работает, делая именно то, что нужно. Простите, что неправильно Вас понял, я решил было, что у Вас такая же проблема.

 

>читая из регистра данных вы вычитываете входные данные а не выходные - это первая ошибка

- чушь!

 

>while(1) - это вторая ошибка

- не ошибка, а просто не очень красиво. Придирка!

 

>делать такое для SSP-slave - третья ошибка

- чушь!

 

>не утруждать себя попытками понимания задачи - четвертая ошибка

- Прежде, чем такое писать, иногда проще попробовать, это не займёт много времени.

 

 

Ну хорошо, красивей будет так:

void clear_buffer_ssp0 (void)
{
    volatile uint8_t Dummy;
    
    while (!(LPC_SSP0->SR & SSP_SR_TFE))   
        Dummy = LPC_SSP0->DR;   
}

 

Оговорился, LPC1768 читает два АЦП.

 

Почему я не могу отредактировать свой пост?

Share this post


Link to post
Share on other sites
>читая из регистра данных вы вычитываете входные данные а не выходные - это первая ошибка

- чушь!

Интересно..., а как вы получаете данные? Из какого регистра вы их забираете? И как в этом случае проц понимает что вы читаете данные, а не очищаете выходное фифо? Как получить данные из входного фифо?

 

>while(1) - это вторая ошибка

- не ошибка, а просто не очень красиво. Придирка!

Допускаю, но учитывая известную конечную длину фифо можно было бы сделать цикл без повисания. Правда тут все опять упирается что нельзя вычитать выходное фифо, но если бы было можно то так...

 

красивей будет так while (!(LPC_SSP0->SR & SSP_SR_TFE))

Красивее, но в свете сказанного ниже ровно так же не правильно. Такая конструкция грозит повисончиком для slave если мастер не решит случайно выдать клоки, да еще с чипселектом если таковой имеется.

 

 

>делать такое для SSP-slave - третья ошибка

- чушь!

Поясню. Вы висите в while до тех пор пока не очиститься выходная очередь, в случае slave выходная очередь очиститься только после того как данные вычитает мастер. Если мастер не будет клочить линию, данные не уйдут никогда и вы будете висеть в while вечно. По мне - это плохое решение. Да я понимаю что вы думали что вы вычитываете выходное фифо, потому цикл и без мастер кончиться, но нет, тут вы в обломчиках...

 

>не утруждать себя попытками понимания задачи - четвертая ошибка

- Прежде, чем такое писать, иногда проще попробовать, это не займёт много времени.

Если вы что-то запустили и оно дало ожидаемый результат, совсем не обязательно что оно работает как планировалось. Доказательство работоспособности тестированием процесс значительно более длинный и сложный, нежели доказательство работоспособности архитектурой. Вам придется провести несколько экспериментов и правильно интерпретировать результат прежде чем вы поймете где ошиблись. В этом случае гораздо проще прочитать страницу

423 Ref manual

 

15:0 DATA Write: software can write data to be sent in a future frame to this

register whenever the TNF bit in the Status register is 1, indicating that

the Tx FIFO is not full. If the Tx FIFO was previously empty and the

SSP controller is not busy on the bus, transmission of the data will

begin immediately. Otherwise the data written to this register will be

sent as soon as all previous data has been sent (and received). If the

data length is less than 16 bits, software must right-justify the data

written to this register.

Read: software can read data from this register whenever the RNE bit

in the Status register is 1, indicating that the Rx FIFO is not empty.

When software reads this register, the SSP controller returns data from

the least recent frame in the Rx FIFO. If the data length is less than 16

bits, the data is right-justified in this field with higher order bits filled with

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this